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

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;
}

相关文章:

  • 第7章:Zephyr 的低功耗机制
  • 跟着华为去变革 ——读《常变与长青》有感
  • 读懂 std::true_type 和 std::false_type
  • 2025年- H52-Lc160--114. 二叉树展开为链表(前序遍历 + 用栈 + 原地修改)--Java版
  • 04_redis之ZSet使用实例-积分榜
  • leetcode-295 Find Median from Data Stream
  • Wan2.1 图生视频 多卡推理批量生成视频
  • 视频问答功能播放器(视频问答)视频弹题功能实例
  • ffmpeg转换竖屏(画面是横屏旋转90度的竖屏文件格式)视频到横屏
  • 网易互娱游戏研发实习一面
  • 在 ElementUI 中实现 Table 单元格合并
  • 萤石云实际视频实时接入(生产环境)
  • Node.js全局对象详解:console、process与核心功能
  • [ARM][架构] 01.ARMv7 特权等级与核心寄存器
  • 代码随想录算法训练营第60期第四十八天打卡
  • 开源 FcDesigner 表单设计器组件事件详解
  • 算法打卡第七天
  • 【ARTS】【LeetCode-59】螺旋矩阵
  • Debian系统安装Python详细教程及常见问题解答
  • Leetcode 3563. Lexicographically Smallest String After Adjacent Removals
  • 哪个网站做新加坡劳务比较好的/如何建立个人网站的步骤
  • 如何改网站的内容/多地优化完善疫情防控措施
  • 企业安全文化建设方案/吉安seo
  • 做的比较好的手机网站/谷歌搜索引擎入口2022
  • 网站建设进度及实施过程/seo排名优化教程
  • 营销网站建设哪家好/app制作