C++ STL vector

vector  与  普通数组  区别

  不同之处:数组是静态的  而vector可以动态扩展

动态扩展:不是在原空间之后续接新空间而是找更大的空间内存,然后将原数据拷贝新空间,释放原空间。   

   vector的迭代器是支持随机访问的迭代器   

vector构造函数

复制代码
 1 #include <iostream>
 2 #include <string>
 3 #include <vector>
 4 using namespace std;
 5 //vector容器构造函数
 6 /*
 7     vector<T> v;                //采用模板实现类实现,默认构造函数
 8     vector(v.begin(),v.end());  //将  v[begin(),end())  前闭后开 区间中的元素拷贝给本身
 9     vector(n,elem);             //构造函数将n个elem拷贝给本身
10     vector(const vector &vec);  //拷贝构造函数
11 */
12 void printVector(vector<int>& v)
13 {
14     for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
15     {
16         cout << *it << " ";
17     }
18     cout << endl;
19 }
20 void test()
21 {
22     vector<int> v1;//默认构造
23     for (int i = 0; i < 10; i++)
24     {
25         v1.push_back(i);
26     }
27     printVector(v1);//0 1 2 3 4 5 6 7 8 9 
28     //通过区间方式进行构造
29     vector<int>v2(v1.begin(), v1.end()); 
30     printVector(v2);//0 1 2 3 4 5 6 7 8 9
31     //n个elem方式构造
32     vector<int>v3(10, 100);//个数  数值
33     printVector(v3);//100 100 100 100 100 100 100 100 100 100
34     //拷贝构造
35     vector<int>v4(v3);
36     printVector(v4);//100 100 100 100 100 100 100 100 100 100
37 }
38 int main()
39 {
40     test();
41     system("pause");
42     return 0;
43 }
复制代码

赋值操作    

复制代码
 1 #include <iostream>
 2 #include <string>
 3 #include <vector>
 4 using namespace std;
 5 //vector容器赋值操作
 6 /*
 7     vector& operator=(const vector &vec);//重载等号操作符
 8     assign(beg, end);                    //将[beg,end)区间中的数据拷贝赋值给本身
 9     assign(n,elem);                      //将n个elem拷贝赋值给本身
10 */
11 void printVector(vector<int>& v)
12 {
13     for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
14     {
15         cout << *it << " ";
16     }
17     cout << endl;
18 }
19 void test()
20 {
21     vector<int> v1;
22     for (int i = 0; i < 10; i++)
23     {
24         v1.push_back(i);
25     }
26     printVector(v1);// 0 1 2 3 4 5 6 7 8 9 
27     //赋值操作
28     vector<int>v2;
29     v2 = v1;
30     printVector(v2);// 0 1 2 3 4 5 6 7 8 9 
31     //assign
32     vector<int>v3;
33     v3.assign(v1.begin(), v1.end());
34     printVector(v3);// 0 1 2 3 4 5 6 7 8 9
35     //assign   n个elem
36     vector<int>v4;
37     v4.assign(10, 100);
38     printVector(v4);// 100 100 ....
39 }
40 int main()
41 {
42     test();
43     system("pause");
44     return 0;
45 }
复制代码

vector容量和大小 

复制代码
 1 #include <iostream>
 2 #include <string>
 3 #include <vector>
 4 using namespace std;
 5 //vector容器的容量和大小操作
 6 /*
 7     empty();               //判断容器是否为空
 8     capacity();            //容器的容量
 9     size();                //返回容器中元素的个数
10     resize(int num);       //重新指定容器的长度num,若容器变长,则以默认值填充新位置。
11                            //如果容器变短,则末尾超出容器长度的元素被删除
12     resize(int num, elem); //重新指定容器的长度num,若容器变长,则以elem值填充新位置。
13                            //如果容器变短,则末尾超出容器长度的元素被删除
14 */
15 void printVector(vector<int>& v)
16 {
17     for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
18     {
19         cout << *it << " ";
20     }
21     cout << endl;
22 }
23 void test()
24 {
25     vector<int>v1;
26     for (int i = 0; i < 10; i++)
27     {
28         v1.push_back(i);
29     }
30     printVector(v1);// 0 1 2 3 4 5 6 7 8 9
31     if (v1.empty())//若为真 代表容器为空
32     {
33         cout << "v1为空" << endl;
34     } 
35     else
36     {
37         cout << "v1不为空" << endl;
38         cout << "v1的容量为:" << v1.capacity() << endl;// 13  动态扩展
39         cout << "v1的大小为:" << v1.size() << endl;//10
40     }
41     //重新指定大小
42     v1.resize(15,1);//利用重载版本,可以指定默认填充值,参数2  若为v1.resize(15);//默认为0
43     printVector(v1);//0 1 2 3 4 5 6 7 8 9 1 1 1 1 1     若为v1.resize(15);// 0 1 2 3 4 5 6 7 8 9 0 0 0 0 0
44     v1.resize(5);//如果重新指定的比原来短了,超出部分会删除掉
45     printVector(v1);// 0 1 2 3 4
46 }
47 int main()
48 {
49     test();
50     system("pause");
51     return 0;
52 }
复制代码

vector插入和删除--push_back()  --pop_back()--  insert()---erase()--  clear()

复制代码
 1 #include <iostream>
 2 #include <string>
 3 #include <vector>
 4 using namespace std;
 5 //vector容器的插入、删除操作
 6 /*
 7     push_back(ele);                             //尾部插入元素ele
 8     pop_back();                                 //删除最后一个元素
 9     insert(const_iterator pos, ele);            //迭代器指定位置pos插入元素ele 
10     insert(const_iterator pos,int count,ele);   //迭代器指定位置pos插入count个元素ele
11     erase(const_iterator pos);                  //删除迭代器指向的元素
12     erase(const_iterator start, const_iterator end);//删除迭代器从start到end之间的元素
13     clear();                                    //删除容器中所有元素
14     
15 */
16 void printVector(vector<int>& v)
17 {
18     for (vector<int>::iterator it = v.begin(); it != v.end(); it++)//iterator:迭代器
19     {
20         cout << *it << " ";
21     }
22     cout << endl;
23 }
24 void test()
25 {
26     vector<int>v1;
27     for (int i = 10; i < 60; i=i+10)
28     {
29         v1.push_back(i);//尾插
30     }
31     printVector(v1);// 10 20 30 40 50
32     //尾删
33     v1.pop_back();
34     printVector(v1);// 10 20 30 4
35     v1.insert(v1.begin(), 100);//插入  第一个参数是迭代器  起始位置插入100
36     printVector(v1);//100 10 20 30 40
37     v1.insert(v1.begin(), 2, 1000);// 参数1:个数  参数2:数值
38     printVector(v1);//1000 1000 100 10 20 30 40
39     //删除   参数也是迭代器
40     v1.erase(v1.begin());// 从起始位置删除一个数字
41     printVector(v1);//1000 100 10 20 30 40
42     //清空
43     //v1.erase(v1.begin(), v1.end());   
44     v1.clear();//与上一语句等同  都为清空语句
45     printVector(v1);//
46 }
47 int main()
48 {
49     test();
50     system("pause");
51     return 0;
52 }
复制代码

vector数据存取 --at -- []

复制代码
 1 #include <iostream>
 2 #include <string>
 3 #include <vector>
 4 using namespace std;
 5 //vector数据存取
 6 /*
 7     at(int idx);//返回索引 idx所指的数据
 8     operator[]; //返回索引 idx所致的数据
 9     front();    //返回容器中第一个数据元素
10     back();     //返回容器中最后一个数据元素
11 */
12 void test()
13 {
14     vector<int>v1;
15     for (int i = 0; i < 10; i++)
16     {
17         v1.push_back(i);
18     }
19     //利用[]访问数组容器中元素
20     for (int i = 0; i < v1.size(); i++)
21     {
22         cout << v1[i] << " ";
23     }
24     cout << endl;// 0 1 2 3 4 5 6 7 8 9
25     //利用at方式访问元素
26     for (int i = 0; i < v1.size(); i++)
27     {
28         cout << v1.at(i) << " ";
29     }
30     cout << endl;// 0 1 2 3 4 5 6 7 8 9
31     //获取第一个元素
32     cout << "第一个元素:" << v1.front() << endl;//0
33     //获取最后一个元素
34     cout << "最后一个元素:" << v1.back() << endl;//9
35 }
36 int main()
37 {
38     test();
39     system("pause");
40     return 0;
41 }
复制代码

vector互换容器  --swap

C++中的匿名对象指的是在创建对象时不进行命名的对象。这样的对象通常用于一次性的操作不需要再次使用或者是作为函数的参数传递

复制代码
 1 #include <iostream>
 2 #include <string>
 3 #include <vector>
 4 using namespace std;
 5 //vector互换容器 
 6 /*
 7     swap(vec);  //将vec与本身的元素互换
 8 */
 9 void printVector(vector<int>& v)
10 {
11     for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
12     {
13         cout << *it << " ";
14     }
15     cout << endl;
16 }
17 void test()//普通交换
18 {
19     vector<int>v1;
20     for (int i = 0; i < 10; i++)
21     {
22         v1.push_back(i);
23     }
24     cout << "交换前" << endl;
25     printVector(v1);//0 1 2 3 4 5 6 7 8 9
26     vector<int>v2;
27     for (int i = 10; i > 0; i--)
28     {
29         v2.push_back(i);
30     }
31     printVector(v2);//10 9 8 7 6 5 4 3 2 1 
32     cout << "交换后" << endl;
33     v1.swap(v2);
34     printVector(v1);//10 9 8 7 6 5 4 3 2 1 
35     printVector(v2);//0 1 2 3 4 5 6 7 8 9
36 }
37 void test2()//收缩内存
38 {
39     vector<int>v;
40     for (int i = 0; i < 100000; i++)
41     {
42         v.push_back(i);
43     }
44     cout << "v的容量:" << v.capacity() << endl;//138255  大于10W
45     cout << "v的大小:" << v.size() << endl;//100000
46     v.resize(3);//重新指定大小
47     cout << "v的容量:" << v.capacity() << endl;//138255
48     cout << "v的大小:" << v.size() << endl;//3
49     //巧用swap收缩内存
50     vector<int>(v).swap(v);
51     //vector<int>(v)匿名对象 通过swap将匿名对象(v)和实际的v指针指向交换
52     //并且语句执行完后释放匿名对象指向  即释放容量138255的空间 v指向容量为3的空间    
53     cout << "v的容量:" << v.capacity() << endl;//3
54     cout << "v的大小:" << v.size() << endl;//3
55 }
56 int main()
57 {
58     //test();
59     test2();
60     system("pause");
61     return 0;
62 }
复制代码

vector容器-预留空间 --reserve

复制代码
 1 #include <iostream>
 2 #include <string>
 3 #include <vector>
 4 using namespace std;
 5 //vector预留空间:减少vector在动态扩展容量时的扩展次数
 6 /*     
 7     reserve:预定
 8     reserve(int len);  //容器预留len个元素长度,预留位置不初始化,元素不可访问
 9 */
10 void test()
11 {
12     vector<int>v;//初始开辟一个空间
13 
14     //利用reserve预留空间
15     v.reserve(100000);// 只开辟一次
16 
17     int num = 0;//统计开辟次数
18     int* p = NULL;
19     for (int i = 0; i < 100000; i++)
20     {
21         v.push_back(i);
22         if (p != &v[0])//&v[0] 初始空间的首地址  开辟新空间则地址改变
23         {
24             p = &v[0];//指针p指向新地址
25             num++;
26         }
27     }
28     cout << "num = " << num << endl;
29 }
30 int main()
31 {
32     test();
33     system("pause");
34     return 0;
35 }
复制代码

posted on   廿陆  阅读(8)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示