【STL】vector容器的赋值,读取、插入、删除、空间压缩和特性详解+实例

mac2024-05-27  40

一 特性说明

vector是一个动态数组,当空间不足的时候插入新元素,vector会重新申请一块更大内存空间,将旧空间数据拷贝到新空间,然后释放旧空间。Vector是单口容器,所以在尾端插入和删除效率较高,在指定位置插入,势必会引起元素移动,效率较低。 ****reserv和resize的区别? 答:reserve是容器预留空间,但在空间内不真正创建元素对象,所以在没有添加新的对象之前,不能引用容器内的元素。 resize是改变容器的大小,且在创建对象,因此,调用这个函数之后,酒可以引用容器内的对象了。

1 Vector 拷贝构造

2常用赋值操作

3-vector的大小操作

4-数据存储操作

5-插入与删除操作

实例:

```cpp #include<iostream> using namespace std; #include<vector> void printVector(vector<int>& v) { for (vector<int>::iterator it = v.begin(); it != v.end(); it++) { cout << *it << " "; } cout << endl; } ///1-初始化 void test01() { vector<int>v1;//默认构造; int arr[] = { 10,20,30,40 }; vector<int>v2(arr, arr + sizeof(arr)/sizeof(int));//数组初始化 vector<int>v3(v2.begin(), v2.end());//将V3用V2来初始化 vector<int>v4(v3); printVector(v2); printVector(v3); printVector(v4); } /2-常用赋值操作 void test02() { int arr[] = { 10,20,30,40 }; vector<int>v1(arr, arr + sizeof(arr) / sizeof(int));//数组初始化 //成员方法 vector<int>v2; v2.assign(v1.begin(), v1.end());//通过v1给v2赋值 //重载= vector<int>v3; v3 = v2; int arr1[] = { 100,200,300,400 }; vector<int>v4(arr1, arr1 + sizeof(arr1) / sizeof(int)); printVector(v1); printVector(v2); printVector(v3); printVector(v4); cout << "------------------------------------" << endl; //交换 v4.swap(v1);//交换的实质是指针指向的交换 printVector(v1); printVector(v2); printVector(v3); printVector(v4); } //3-大小操作 void test03() { int arr1[] = { 100,200,300,400 }; vector<int>v1(arr1, arr1 + sizeof(arr1) / sizeof(int)); cout << "size:" << v1.size() << endl;//元素个数 if (v1.empty()) cout << "空!" << endl; cout << "不空" << endl; printVector(v1); v1.resize(2);//resize 若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除 //输出:100 200 printVector(v1); v1.resize(6,1);//输出100 200 1 1 1 1 变长,多的改为1.若写成v1.resize(6);输出100 200 0 0 0 0 printVector(v1); cout << v1.capacity() << endl;//容量输出 } 4-vector 存取数据 void test04() { int arr1[] = { 100,200,300,400 }; vector<int>v1(arr1, arr1 + sizeof(arr1) / sizeof(int)); for (int i = 0; i < v1.size(); ++i) cout << v1[i] << " "; cout << endl; for (int i = 0; i < v1.size(); ++i) cout << v1.at(i) << " "; cout << endl; //区别:at抛异常 []不抛异常 cout << "front:" << v1.front() << endl; cout << "end:" << v1.back() << endl; } /5-插入删除 void test05() { vector<int>v; v.push_back(10); v.push_back(20); //头插法 v.insert(v.begin(), 30);//在头插入30 v.insert(v.end(), 40);//在尾插入40 v.insert(v.begin() + 2, 100);//在第二个位置上插入100 //vector支持随机访问 //支持数组下标,一般都支持随机访问 //迭代器可以直接+2, +3 -2 -5操作 printVector(v);//30 10 100 20 40 //删除 v.erase(v.begin());//删除第一个 printVector(v); v.erase(v.begin() + 1, v.end());//删除第二个到最后的 printVector(v); v.clear();//清空所有 printVector(v); }

//巧用swap缩减空间

void test06() { //vector 添加元素,它会自动增长 删除元素时候,不会自动减少。 vector<int>v; for (int i = 0; i < 100000; ++i) v.push_back(i); cout << "size:" << v.size() << endl;// 100000 cout << "capacity:" << v.capacity() << endl;//138255 v.resize(10); cout << "---------------------------" << endl; cout << "size:" << v.size() << endl; //10 cout << "capacity:" << v.capacity() << endl;//138255 //收缩空间 vector<int>(v) //这是个匿名对象 .swap(v);//用v来初始化这个对象,那么会动态对其进行空间的分配 cout << "---------------------------" << endl; cout << "size:" << v.size() << endl;//10 cout << "capacity:" << v.capacity() << endl;//10 } int main() { //test01(); //test02(); //test03(); //test04(); //test05(); test06(); return 0; }

reserve 预留空间 与resize区别

void test07() { //reserve 预留空间 与resize区别 int num = 0;//计数对象拷贝的次数 int* address = NULL; vector<int>v; v.reserve(100000);//该句话不加之前 需要拷贝24次或者别的次数(电脑软件不同),当加上该句之后最后结果Num=1; //reserve(100000) 代表一开始给v预留100000个空间 for (int i = 0; i < 10000; ++i) { v.push_back(i); if (address != &(v[0])) { address = &(v[0]); num++; } } cout << "num:" <<num<<endl; }
最新回复(0)