当前位置: 首页 > java >正文

C++(4)

四、模板与容器

1. 模板

1.1 函数模板

#include <iostream>
using namespace std;// 函数模板声明
template<typename T>  // 也可使用 class
T add(T a, T b) {return a + b;
}int main() {string a = "hello";string b = "world";cout << add(a, b) << endl;    // 输出 hello worldcout << add(1, 2) << endl;    // 输出 3cout << add(1.3, 2.2) << endl;// 输出 3.5return 0;
}

1.2 类模板(类内声明类外定义)

#include <iostream>
using namespace std;// 类模板声明
template<class T>
class Test {
private:T val;
public:Test(T val);                // 构造函数声明T get_val();                // 获取值声明void set_val(const T &val); // 设置值声明
};// 类模板成员函数定义
template<class T>
Test<T>::Test(T val) : val(val) {}template<class T>
T Test<T>::get_val() {return val;
}template<class T>
void Test<T>::set_val(const T &val) {this->val = val;
}int main() {Test<int> t1(20);cout << t1.get_val() << endl;t1.set_val(10);cout << t1.get_val() << endl;Test<double> t2(20.3);cout << t2.get_val() << endl;return 0;
}

2. 容器

2.1 标准模板库(STL)

STL包含三大组件:

  • ​算法​​(algorithm)
  • ​容器​​(container)
  • ​迭代器​​(iterator)

2.2 顺序容器

2.2.1 array数组
#include <array>
#include <iostream>
using namespace std;int main() {array<int, 5> arr = {1, 2, 3}; // 后两位自动初始化为0// 访问元素cout << arr[0] << endl;    // 1cout << arr.at(4) << endl; // 0(推荐使用at())// 修改元素arr[3] = 200;// 遍历方式for(int i = 0; i < arr.size(); i++) {cout << arr[i] << endl;}for(auto num : arr) {cout << num << endl;}return 0;
}
2.2.2 vector向量
#include <vector>
#include <iostream>
using namespace std;int main() {vector<int> vec(5); // 创建长度为5的int容器// 添加元素vec.push_back(222);vec.insert(vec.begin()+2, 333);// 修改元素vec[1] = 666;vec.at(3) = 777;// 删除元素vec.pop_back();          // 删除末尾vec.erase(vec.begin()+1);// 删除指定位置// 遍历方式for(int i = 0; i < vec.size(); i++) {cout << vec[i] << endl;}for(auto num : vec) {cout << num << " ";}return 0;
}
2.2.3 list列表
#include <list>
#include <string>
#include <iostream>
using namespace std;int main() {list<string> lis(5, "hello"); // 初始化5个"hello"// 添加元素lis.push_back("world");lis.push_front("haha");lis.insert(++lis.begin(), "222");// 删除元素lis.pop_front();auto it = lis.begin();advance(it, 1);lis.insert(it, "333");lis.erase(--lis.end());// 修改元素it = lis.end();advance(it, 2);*it = "200";// 遍历输出for(string s : lis) {cout<< s << endl;}return 0;
}
2.2.4 deque队列
#include <deque>
#include <iostream>
using namespace std;int main() {deque<int> deq(5);// 添加元素deq.push_back(222);deq.insert(deq.begin()+2, 333);// 修改元素deq[1] = 666;deq.at(3) = 777;// 删除元素deq.pop_back();deq.erase(deq.begin()+1);// 遍历输出for(int i = 0; i < deq.size(); i++) {cout << deq[i] << endl;}return 0;
}

2.3 关联容器

2.3.1 map键值对
#include <map>
#include <string>
#include <iostream>
using namespace std;int main() {map<string, int> ma;// 添加元素ma["身高"] = 180;ma.insert(make_pair("年龄", 24));// 修改元素ma["身高"] = 175;// 查找元素if(ma.find("体重") == ma.end()) {cout << "没有体重数据" << endl;}// 删除元素ma.erase("年龄");// 遍历输出for(auto& pair : ma) {cout << pair.first << ": " << pair.second << endl;}return 0;
}

2.4 迭代器遍历

#include <vector>
#include <array>
#include <list>
#include <deque>
#include <map>
#include <iostream>
using namespace std;int main() {// 遍历stringstring s = "abcdefg";for(auto it = s.cbegin(); it != s.cend(); ++it) {cout << *it << " ";}cout << endl;// 遍历arrayarray<int, 5> arr = {1, 2, 3, 4, 5};for(auto it = arr.cbegin(); it != arr.cend(); ++it) {cout << *it << " ";}cout << endl;// 遍历mapmap<string, int> ma = {{"A", 1}, {"B", 2}};for(auto it = ma.cbegin(); it != ma.cend(); ++it) {cout << it->first << ":" << it->second << endl;}return 0;
}

http://www.xdnf.cn/news/9046.html

相关文章:

  • 解锁 Linux 内核潜能:高效参数调优实战指南
  • 《软件工程》第 3 章 -需求工程概论
  • vector的实现
  • TypeScript 针对 iOS 不支持 JIT 的优化策略总结
  • 裁判模型的定义与训练
  • 单片机简介
  • Postman基础操作
  • Vue 2 混入 (Mixins) 的详细使用指南
  • 如何通过AI辅助数据分析
  • leetcode-295 Find Median from Data Stream
  • 【科研绘图系列】R语言绘制柱状图(bar plot)
  • Vue中的 VueComponent
  • pytorch简单线性回归模型
  • 如何轻松地将文件从 iPhone 传输到 PC
  • Python基础教程:从零开始学习编程 - 第1-3天
  • 全光网络ICU床旁监护系统:重新定义重症监护的智慧中枢
  • python入门day01
  • UE5 Niagara Advance 学习笔记
  • git学习笔记
  • matlab实现激光腔长计算满足热透镜效应
  • JAVA 学习日志
  • 防火墙的SD-WAN功能
  • JAVA基础编程练习题--50道
  • 【Webtrees 用户手册】第 2 章 - 访客须知
  • 网易互娱游戏研发实习一面
  • ubuntu脚本常用命令
  • 海外呼叫中心优势与挑战分析
  • Bota Systems与Kinova合作:赋予AI机器人触觉能力
  • 如何给自研MCP加上安全验证
  • 类的设计模式——单例、工厂以及建造者模式