c++语法复习(一)

张开发
2026/4/13 2:46:40 15 分钟阅读

分享文章

c++语法复习(一)
本文总结刷题中遇到的c语法一、STL1. 是什么Standard Template Library是 C 标准库中提供的通用数据结构 算法工具集合STL 不是一个单独的库把数据结构和算法解耦2. 核心四大部分1️⃣ 容器containers STL 容器 一组模板类实现常见数据结构用来存数据✔ 顺序容器1. vector动态数组支持随机访问v[i]egvectorint v {1,2,3}; v.push_back(4); cout v[0]; // 12. list链表listint l {1,2,3}; l.push_back(4);3. deque双端队列dequeint d; d.push_front(1); d.push_back(2);✔ 关联容器自动排序set去重 排序setint s; s.insert(3); s.insert(1); s.insert(3); // 不会重复mapkey-value✔ 无序容器哈希unordered_set下面有详细介绍、unordered_map✔ 容器适配器stack、queue、priority_queue(堆stackint s; queueint q; priority_queueint pq;容器使用方法1. 引入头文件#include vector #include set #include map #include unordered_map #include stack #include queue2. 创建容器vectorint v; mapstring,int m;3. 常用操作插入v.push_back(1); s.insert(2); m[a] 3;删除v.pop_back(); s.erase(2);遍历方法一for (int x : v) { cout x; }方法二迭代器for (auto it v.begin(); it ! v.end(); it) { cout *it; }2️⃣ 算法algorithms 用来处理数据常见sort(); // 排序 reverse(); // 翻转下面有详细介绍 find(); // 查找下面有详细介绍 swap(); // 交换 max(); min();// 最大最小 算法不依赖具体容器3️⃣ 迭代器iterators 用来连接容器和算法本质 类似“指针”的统一访问方式vectorint v {1,2,3}; for (auto it v.begin(); it ! v.end(); it) { cout *it; } 关键作用让sort / find可以作用在任何容器上4️⃣ 函数对象仿函数 本质像函数一样用的对象struct MyCompare { bool operator()(int a, int b) { return a b; } };用在排序sort(v.begin(), v.end(), MyCompare());总结算法进行数据处理迭代器用来访问数据容器用来存储数据二、哈希集合1概念unordered_set是 C STL 中的哈希集合底层哈希表实现查找 / 插入 / 删除平均 O (1)。// 空集合 unordered_setint s1; // 用数组/vector 初始化直接去重 vectorint nums {1,2,2,3}; unordered_setint s2(nums.begin(), nums.end()); // s2 {1,2,3} // 直接初始化 unordered_setint s3 {1,2,3,3}; // s3 {1,2,3}begin和endbegin返回指向容器第一个元素的迭代器end返回指向容器最后一个元素下一个位置的迭代器2集合常用函数insert/find/count/erase/size/empty/clear1. find()查找元素// 查找元素 5 auto it s.find(5); // 判断是否找到 if (it ! s.end()) { // 找到了*it 就是元素值 cout 找到 *it endl; } else { // 没找到 cout 未找到 endl; }find返回值找到了 → 返回这个元素的位置没找到 → 返回end()nums_set.end()集合的末尾位置不是有效元素统一用end代表没找到2. 插入元素s.insert(5); // 插入元素 5注意vector添加元素用的是push_back而不是insert3. 判断元素是否存在// count()返回元素出现次数set 里只有 0 或 1 if (s.count(5)) { cout 5 存在 endl; }4. 获取大小/判空s.size(); // 元素个数 s.empty(); // 空返回 true否则 false5. 遍历集合// 范围for循环最简单 for (int num : s) { cout num ; } // 迭代器遍历 for (auto it s.begin(); it ! s.end(); it) { cout *it ; }6. 删除元素// 用法1删除指定 key m.erase(num); // 用法2清空整个 map m.clear();哈希表pairunordered_map 存的是【键值对】插入时必须用一对数据而 pair 就是用来装 “一对数据” 的工具。ans.insert(pairint, int(nums[i], i));三、 迭代器迭代器是一个对象可以被视为指向容器中元素的指针它提供了一种方法来遍历容器中的元素。iterator头文件使用场景1.用 STL 算法时须用迭代器eg:sort、find、reverse、count……vectorint v {3,1,2}; sort(v.begin(), v.end()); // 必须给迭代器 auto it find(v.begin(), v.end(), 3);2.set / map不能用下标set:setint s {1,2,3}; for (auto it s.begin(); it ! s.end(); it) { cout *it; }map:mapstring,int m; m[a] 1; for (auto it m.begin(); it ! m.end(); it) { cout it-first it-second endl; }语法通常如下// 使用迭代器遍历容器 for (ContainerType::iterator it container.begin(); it ! container.end(); it) { // 访问元素 *it }auto itfor(auto it mp.begin(); it ! mp; it){//迭代器相当于指针遍历 map ans.push_back(it - second); }auto 让编译器自动判断类型不用手写mp的类型it就是迭代器是指向哈希表中元素的指针it-first key排序后的字符串it-second value一组单词四、函数1. reverse()C 标准库自带的函数专门用来翻转一段数据属于algorithm头文件egabcd→ 翻转 →dcba用法reverse(开始迭代器, 结束迭代器);从第 i 个字符开始翻转k 个字符到第 ik 个字符之前停下reverse(s.begin() i, s.begin() i k);2. resize()是string和vector自带的成员函数, 用于改变容器的大小用法string s abc; s.resize(5); \\变大多出来的长度填 \0 string s abcdef; s.resize(3);\\变小直接截断egs.resize(s.size() count * 5);3. string的常见函数s.size(); // 长度 s.empty(); // 是否为空 s[i]; // 取第 i 个字符 s.push_back(c); // 末尾加字符 s.pop_back(); // 删除最后一个 s.substr(pos, len); // 截取子串 s.find(str); // 查找 reverse(s.begin(), s.end()); // 翻转 s.resize(n); // 改变长度getline(): 用来读取「一整行字符串」的输入函数;cin s遇到空格、Tab、回车就会停止读取getline会把整行所有内容包括空格全部读进来getline(cin, s)4. vector的常见函数v.size(); v.empty(); v[i]; v.push_back(x); v.pop_back(); v.clear(); reverse(v.begin(), v.end()); v.resize(n);语法点1. c中 和 :双引号 :装一串字符字符串,可以是 0 /1 /多个字符类型const char* 给char[]/string用单引号 :只能装一个字符英文、数字、符号都可以不能ab → 给char用2. for(string str:strs)加 直接用原来的字符串不复制为引用传递零拷贝3. std::string::nposstring类里面的常量 全称是no position用来表示在字符串里查找某个字串时没没找到。本质是一个特殊的数值-1或最大无符号整数if (t.find(s) ! std::string::npos) return true;表达如果在t里能找到s→ 返回true4. pair()C STL 标准库提供了 pair 类模板其专门用来将 2 个普通元素 first 和 second可以是 C 基本数据类型、结构体、类自定的类型创建成一个新元素first, second。pair 类模板定义在utility头文件中所以在使用该类模板之前需引入此头文件。//尾插法建链表 pairListNode*, ListNode* buildList(const vectorint nums){ ListNode* dummyhead new ListNode(0); ListNode* tail dummyhead; for(int x:nums){ tail - next new ListNode(x); tail tail - next; } return{dummyhead - next, tail}; } int main(){ auto partA buildList(a); ListNode* headA partA.first;//头节点 if(partA. second ! nullptr){ partA.second - next CommnonHead;//尾节点 }else{ headA CommnonHead; } }5.push_backvspushpush_back是 vector 用的表示在末尾插入元素push是 stack/queue 用的表示压栈/入队6. 为什么 string 可以用因为 C 给string做了运算符重载string s ab; s c; // s 变成 abc s 123; // s 变成 abc1237.stoll函数即string to long longC 标准库里的一个字符串转 long long64位整数函数。st.push(stoll(tokens[i]));把tokens[i]字符串转换成long long再压入栈。参考C中的begin和end菜鸟教程C STL pair用法详解

更多文章