嗨~大家好这里是春栀怡铃声的博客~“做你害怕的事然后发现不过如此~”目录创建vector遍历方法迭代器reserve 扩容resize 对size 进行改变 会加值会减值insertsizecapacityemptypush_backeraseswapclear创建vectorvectorintv2(10, 2); vectorint v1; vectorintv3(v2.begin(), --v2.end()); //迭代器创建遍历方法范围for由2部分组成冒号前面是范围内用于迭代的变量第二变量则表示被迭代的范围自动读取数据自动结束vectorintv3(10,2); for (auto e : v3) { cout e ; } cout endl;下标访问//下标访问 for (size_t i 0; i v3.size(); i) { cout v3[i] ; } cout endl;迭代器vector 的迭代器可以理解成“指向元素的通用指针”用来遍历和操作容器里的元素。常用接口vectorint v (10,2);auto it v.begin(); // 指向第一个元素auto ed v.end(); // 指向最后一个元素的后一个位置遍历for (auto it v.begin(); it ! v.end(); it) {cout *it ;}常见特性- *it 取值- it 前进- it n、it - n因为 vector 的迭代器是随机访问迭代器- it1 it2可比较位置先后- it[n]等价于 *(it n)只读迭代器vectorint::const_iterator cit v.cbegin();const_iterator 不能修改元素。反向迭代器for (auto it v.rbegin(); it ! v.rend(); it) { std::cout *it ; }迭代器遍历//迭代器遍历 vectorint::iterator it v3.begin(); //auto itv3.begin(); while (it ! v3.end()) { cout *it ; it; } cout endl;reserve 扩容提前开好空间像下面的示例创建了string 类 的tmp 想让tmp 拥有和s1一样大的空间存放数据使用reserve 开出空间a. reserve(n) ncapacity在vector 中明确不会缩容在string (gcc) 会缩容,string(vs.2022) 不会缩容vectorintv(10, 2); v.reserve(5); cout v.size() endl; cout v.capacity() endl; v.reserve(20); cout v.size() endl; cout v.capacity() endl;初始有效数据有10个空间大小也为10第一次reserve(5) 510 ,无需扩容并且不会缩小空间大小 空间大小和有效数据都不变第二次reserve(20) 需要扩容空间大小变为20有效数据不变resize 对size 进行改变 会加值会减值vectorintv(10, 2); v.resize(5); cout v.size() endl; cout v.capacity() endl; v.resize(15,6); cout v.size() endl; cout v.capacity() endl; v.resize(20, 3); cout v.size() endl; cout v.capacity() endl;初始位置有效数据有10个空间大小为10经过第一次resize(5) 有效数据缩减到5空间大小不变第二次resize(15,6) 有效数据加到15空间也扩大到15新增的有效数据都是6第三次 resize(20,3) 有效数据加到20空间扩容到22 新增的有效数据都是3insertinsert 只能传迭代器第一个参数代表指向位置插入第二个参数代表插入的值void text_vector5() { vectorintv(10, 2); v.insert(v.begin(), 4); v.insert(v.begin() 3, 6); //可以通过迭代器加来进行随机位置插入 for (auto e : v) { cout e ; } cout endl; }size返回的是v1的有效数据个数使用v1.size();capacity返回的是v1的空间大小v1.capacity();empty返回v1是否为空的判断值是空返回true ,不是空返回falsepush_back使用push_back 在v1末尾插入vectorintv1; v1.push_back(5);eraseerase 只能传迭代器一种用法是直接删除传入迭代器指向的位置的值另一种是删除第一个迭代器到第二个迭代器的范围中的值vectorintv1(10,2); v1.erase(v1.begin()); for (auto e : v1) { cout e ; } cout endl; v1.erase(--v1.end()); for (auto e : v1) { cout e ; } cout endl;swap• vector 的 swap 用来交换两个 vector 的内容时间复杂度通常是 O(1)。用法#include iostream #include vector using namespace std; int main() { vectorint a {1, 2, 3}; vectorint b {4, 5}; a.swap(b); for (int x : a) cout x ; // 4 5 cout endl; for (int x : b) cout x ; // 1 2 3 cout endl; }交换后- a 变成原来 b 的内容- b 变成原来 a 的内容包括- 元素内容- size()- capacity()clear只删除v1中的数据v1的空间大小不变
【C++修仙录02】筑基篇:vector 使用
嗨~大家好这里是春栀怡铃声的博客~“做你害怕的事然后发现不过如此~”目录创建vector遍历方法迭代器reserve 扩容resize 对size 进行改变 会加值会减值insertsizecapacityemptypush_backeraseswapclear创建vectorvectorintv2(10, 2); vectorint v1; vectorintv3(v2.begin(), --v2.end()); //迭代器创建遍历方法范围for由2部分组成冒号前面是范围内用于迭代的变量第二变量则表示被迭代的范围自动读取数据自动结束vectorintv3(10,2); for (auto e : v3) { cout e ; } cout endl;下标访问//下标访问 for (size_t i 0; i v3.size(); i) { cout v3[i] ; } cout endl;迭代器vector 的迭代器可以理解成“指向元素的通用指针”用来遍历和操作容器里的元素。常用接口vectorint v (10,2);auto it v.begin(); // 指向第一个元素auto ed v.end(); // 指向最后一个元素的后一个位置遍历for (auto it v.begin(); it ! v.end(); it) {cout *it ;}常见特性- *it 取值- it 前进- it n、it - n因为 vector 的迭代器是随机访问迭代器- it1 it2可比较位置先后- it[n]等价于 *(it n)只读迭代器vectorint::const_iterator cit v.cbegin();const_iterator 不能修改元素。反向迭代器for (auto it v.rbegin(); it ! v.rend(); it) { std::cout *it ; }迭代器遍历//迭代器遍历 vectorint::iterator it v3.begin(); //auto itv3.begin(); while (it ! v3.end()) { cout *it ; it; } cout endl;reserve 扩容提前开好空间像下面的示例创建了string 类 的tmp 想让tmp 拥有和s1一样大的空间存放数据使用reserve 开出空间a. reserve(n) ncapacity在vector 中明确不会缩容在string (gcc) 会缩容,string(vs.2022) 不会缩容vectorintv(10, 2); v.reserve(5); cout v.size() endl; cout v.capacity() endl; v.reserve(20); cout v.size() endl; cout v.capacity() endl;初始有效数据有10个空间大小也为10第一次reserve(5) 510 ,无需扩容并且不会缩小空间大小 空间大小和有效数据都不变第二次reserve(20) 需要扩容空间大小变为20有效数据不变resize 对size 进行改变 会加值会减值vectorintv(10, 2); v.resize(5); cout v.size() endl; cout v.capacity() endl; v.resize(15,6); cout v.size() endl; cout v.capacity() endl; v.resize(20, 3); cout v.size() endl; cout v.capacity() endl;初始位置有效数据有10个空间大小为10经过第一次resize(5) 有效数据缩减到5空间大小不变第二次resize(15,6) 有效数据加到15空间也扩大到15新增的有效数据都是6第三次 resize(20,3) 有效数据加到20空间扩容到22 新增的有效数据都是3insertinsert 只能传迭代器第一个参数代表指向位置插入第二个参数代表插入的值void text_vector5() { vectorintv(10, 2); v.insert(v.begin(), 4); v.insert(v.begin() 3, 6); //可以通过迭代器加来进行随机位置插入 for (auto e : v) { cout e ; } cout endl; }size返回的是v1的有效数据个数使用v1.size();capacity返回的是v1的空间大小v1.capacity();empty返回v1是否为空的判断值是空返回true ,不是空返回falsepush_back使用push_back 在v1末尾插入vectorintv1; v1.push_back(5);eraseerase 只能传迭代器一种用法是直接删除传入迭代器指向的位置的值另一种是删除第一个迭代器到第二个迭代器的范围中的值vectorintv1(10,2); v1.erase(v1.begin()); for (auto e : v1) { cout e ; } cout endl; v1.erase(--v1.end()); for (auto e : v1) { cout e ; } cout endl;swap• vector 的 swap 用来交换两个 vector 的内容时间复杂度通常是 O(1)。用法#include iostream #include vector using namespace std; int main() { vectorint a {1, 2, 3}; vectorint b {4, 5}; a.swap(b); for (int x : a) cout x ; // 4 5 cout endl; for (int x : b) cout x ; // 1 2 3 cout endl; }交换后- a 变成原来 b 的内容- b 变成原来 a 的内容包括- 元素内容- size()- capacity()clear只删除v1中的数据v1的空间大小不变