Loading... STL中最常用的容器为vector,可以理解为数组! ## vector存放内置数据类型 容器:`vector` 算法:`for_each` 迭代器:`vector< int >: :iterator` ## 须包含头文件 `#include< vector >` ## 遍历容器的三种方法: ```cpp #include<iostream> #include<vector> #include<algorithm> using namespace std; void prin(int val) { cout << val << " "; } void prin_arr() { vector<int>arr;//创建一个vector容器 for (int i = 0; i < 10; i++) { arr.push_back(i); } //第一种遍历容器方法 vector<int>::iterator itbegin = arr.begin();//迭代相当于指针 vector<int>::iterator itend = arr.end(); while (itbegin != itend) { cout << *itbegin << " "; itbegin++; } cout << endl << endl; //第二种遍历容器方法 for(vector<int>::iterator itbegin = arr.begin(); itbegin != arr.end(); itbegin++) cout << *itbegin << " "; cout << endl << endl; //第三种遍历容器方法 for_each(arr.begin(), arr.end(), prin);//需要包含algorithm头文件,并且需要一个prin函数操作遍历内容 } int main() { prin_arr(); return 0; } ``` ## vector存放自定义数据类型 ```cpp #include<iostream> #include<vector> #include<string> using namespace std; class Person { public: Person(string name, int age) { this->m_Name = name; this->m_Age = age; } string m_Name; int m_Age; }; //存放自定义数据类型 void text01() { vector<Person>v; //创建容器 Person p1("张三", 18); Person p2("李四", 19); Person p3("王五", 17); v.push_back(p1);//向容器导入数据 v.push_back(p2); v.push_back(p3); for (vector<Person>::iterator it = v.begin(); it != v.end(); it++)//遍历输出容器中的数据 { cout << it->m_Name <<":"<< it->m_Age << endl; } } //存放自定义数据类型的指针 void text02() { vector<Person*>v; //创建容器 Person p1("张三", 18); Person p2("李四", 19); Person p3("王五", 17); v.push_back(&p1);//向容器导入数据 v.push_back(&p2); v.push_back(&p3); for (vector<Person*>::iterator it = v.begin(); it != v.end(); it++)//遍历输出容器中的数据 { cout << (*it)->m_Name << ":" << (*it)->m_Age << endl; } } int main() { text01(); text02(); return 0; } ``` ## vector容器嵌套容器 ```cpp #include<iostream> #include<vector> #include<string> using namespace std; void text() { vector<vector<int>>v;//创建一个大容器(大容器里面有小容器) vector<int>v1;//创建一个小容器 vector<int>v2; vector<int>v3; vector<int>v4; for (int i = 0; i < 4; i++)//给小容器赋初值 { v1.push_back(i + 1); v2.push_back(i + 2); v3.push_back(i + 3); v4.push_back(i + 4); } v.push_back(v1);//把小容器插到大容器里面 v.push_back(v2); v.push_back(v3); v.push_back(v4); //实际上可以理解成一个二维数组,大容器为行 ,小容器为列 for (vector<vector<int>>::iterator it = v.begin(); it != v.end(); it++)//遍历大容器 { for (vector<int> ::iterator is = (*it).begin(); is != (*it).end(); is++)//遍历小容器 { cout << *is<<" "; } cout << endl; } } int main() { text(); return 0; } ``` ## 构造函数: ### 功能: vector数据结构和数组非常相似,也称为单端数组 ### vector与普通数组的区别: 不同之处在于数组是静态空间,而vector可以动态扩展 ### 动态扩展: 并不是在原空间之后接续新空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放原空间 ### 函数原型: <div class="tip inlineBlock success"> vector< int>v; //采用模板实现类实现,默认构造函数 vector(v.begin(), v.end); //将v[begin(), end()]区间中的元素拷贝给本身 vector(n, elem); //构造函数将n个elem拷贝给本身 vector(const vector &vec); //拷贝构造函数 </div> ### 示例: ```cpp #include<iostream> #include<vector> using namespace std; void print_vector(vector<int>& v) { for (vector<int>::iterator it = v.begin(); it != v.end(); it++) { cout << *it << " "; } cout << endl; } void text() { vector<int>v;//默认构造,无参构造 for (int i = 0; i < 10; i++) { v.push_back(i); } print_vector(v); vector<int>v1(v.begin(), v.end());//通过区间方式构造 print_vector(v1); vector<int>v3(10, 0);//n个elem构造 print_vector(v3); vector<int>v4(v1);//拷贝构造 print_vector(v4); } int main() { text(); return 0; } ``` ## 赋值操作: ### 功能描述: 给vector容器进行赋值 ### 函数原型: <div class="tip inlineBlock success"> vector& operator = (const vector &vec);//重载等号操作符 assign(beg, end); //将(beg, end)区间中的数据拷贝赋值给本身 assign(n, elem); //将n个elem拷贝赋值给本身 </div> ### 示例: ```cpp #include<iostream> #include<vector> using namespace std; void print_vector(vector<int>& v) { for (vector<int>::iterator it = v.begin(); it != v.end(); it++) { cout << *it << " "; } cout << endl; } void text() { vector<int>v;//默认构造,无参构造 for (int i = 0; i < 10; i++) { v.push_back(i); } print_vector(v); vector<int>v1; v1 = v;//通过直接赋值方式 print_vector(v1); vector<int>v3; v3.assign(v1.begin(), v1.end());//通过区间构造 print_vector(v3); vector<int>v4; v4.assign(10, 0);//n个elem方式赋值 print_vector(v4); } int main() { text(); return 0; } ``` ## 容量和大小: ### 功能描述: 对vector容器的容量和大小操作 ### 函数原型: <div class="tip inlineBlock success"> empty();//判断容器是否为空 capacity();//容器的容量 size();//返回容器中元素的个数 resize(int num);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置,如果容器变短,则末尾超出容器长度的元素被删除 resize(int num, elem);//重新指定容器的长度为num,若容器变长,则以elem值值填充位置,如果容器变短,则末尾超出容器长度的元素被删除 </div> ### 示例: ```cpp #include<iostream> #include<vector> using namespace std; void print_vector(vector<int>& v) { for (vector<int>::iterator it = v.begin(); it != v.end(); it++) { cout << *it << " "; } cout << endl; } void text() { vector<int>v;//默认构造,无参构造 for (int i = 0; i < 10; i++) { v.push_back(i); } print_vector(v); if (v.empty()) { cout << "v为空!"; } else { cout << "v不为空!"<<endl; cout << "v的容量大小:" << v.capacity() << endl; cout << "v的元素个数" << v.size() << endl; } v.resize(15);//若容器容量小于扩充后的容量,则默认用0填充新位置 print_vector(v); v.resize(15,1); print_vector(v);//若容器容量小于扩充后的容量,则可以利用重载填充新位置 v.resize(5);//若容量容器大于指定容器大小,则超出容器容量部分被删除 print_vector(v); } int main() { text(); return 0; } ``` ## 插入和删除: ### 功能描述: 对vector容器进行插入、删除操作 ## 函数原型: <div class="tip inlineBlock success"> push_back(ele); //尾部插入元素ele pop_back(); //删除最后一个元素 insert(const_iterator pos, ele) //迭代器指向位置pos插入元素ele insert(const_iterator pos, int count, ele);//迭代器指向位置pos插入count个元素ele erase(const_iterator pos);//删除迭代器指向的元素 erase(const_iterator start, const_iterator end);//删除迭代器从start到end之间的元素 clear();//删除容器中的所以元素 </div> ## 示例: ```cpp #include<iostream> #include<vector> using namespace std; void print_vector(vector<int>& v) { for (vector<int>::iterator it = v.begin(); it != v.end(); it++) { cout << *it << " "; } cout << endl; } void text() { vector<int>v;//默认构造,无参构造 for (int i = 0; i < 10; i++) { v.push_back(i);//尾插法 } print_vector(v); v.pop_back();//尾删 print_vector(v); v.insert(v.begin(), 100);//首插一个100 print_vector(v); v.insert(v.begin(),4, 100);//首插4个100 print_vector(v); v.erase(v.begin());//删除首个元素 print_vector(v); v.erase(v.begin(),v.end());//删除begin 到 end 之间的元素 print_vector(v); v.clear();//清空容器 } int main() { text(); return 0; } ``` ## 数据存取: ### 功能描述: 对vector中的数据的存取操作 ### 函数原型: <div class="tip inlineBlock success"> at(int idx);//返回索引idx所指的数据 operator[];//返回索引idx所指的数据 front(); //返回容器中的第一个数据元素 back(); //返回容器中最后一个数据元素 </div> ### 示例: ```cpp #include<iostream> #include<vector> using namespace std; void text() { vector<int>v;//默认构造,无参构造 for (int i = 0; i < 10; i++) { v.push_back(i); } for (int i = 0; i < v.size(); i++)//通过[]输出数组元素 { cout << v[i] << " "; } cout << endl; for (int i = 0; i < v.size(); i++)//通过at输出数组元素 { cout << v.at(i) << " "; } cout << endl; cout << "输出容器第一个元素" << v.front() << endl; cout << "输出容器最后个元素" << v.back() << endl; } int main() { text(); return 0; } ``` ## 互换容器: ### 功能描述: 实现两个容器内元素进行互换 ### 函数原型: swap(vec);//将vec与本身的元素互换 ### 示例: ```cpp #include<iostream> #include<vector> using namespace std; void print_vector(vector<int>&v) { for (int i = 0; i < v.size(); i++) { cout << v.at(i) << " "; } cout << endl; } void text() { cout << "交换前" << endl; vector<int>v;//默认构造,无参构造 for (int i = 0; i < 10; i++) { v.push_back(i); } print_vector(v); vector<int>v1; for (int i = 10; i > 0; i--) { v1.push_back(i); } print_vector(v1); cout << "交换后" << endl; v.swap(v1); print_vector(v); print_vector(v1); } void text01() { cout << "实际用途!" << endl; vector<int>v1; for (int i = 0; i < 9999999; i++) { v1.push_back(i); } cout << "v1容器的容量大小" << v1.capacity()<<endl; cout << "v1所含有元素的大小" << v1.size()<< endl; cout << endl; v1.resize(3); cout << "v1容器的容量大小" << v1.capacity() << endl; cout << "v1所含有元素的大小" << v1.size() << endl; cout << endl; vector<int>(v1).swap(v1);//收缩容器容量空间 cout << "v1容器的容量大小" << v1.capacity() << endl; cout << "v1所含有元素的大小" << v1.size() << endl; } int main() { text(); text01(); return 0; } ``` ## 预留空间: ### 功能描述: 减少vector在动态扩展容量时的次数 ### 函数原型: reserve(int len);//容器预留len个元素长度,预留位置不初始化,元素不可访问 ### 示例: ```cpp #include<iostream> #include<vector> using namespace std; void text() { vector<int>v; v.reserve(1000000);//如果不reserve的话num一定不为1,也就是说容器需要多次寻找才能找到合适的容量空间 int num = 0; int* p = NULL; for (int i = 0; i < 1000000; i++) { v.push_back(i); if (p != &v[0]) { p = &v[0]; num++; } } cout << "num的次数" << num << endl; } int main() { text(); return 0; } ``` 最后修改:2021 年 09 月 18 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果文章有用,请随意打赏。