当前位置:   article > 正文

C++——vector容器_c++创建vector

c++创建vector

目录

1 vector基本概念

2 vector构造函数

3 vector赋值操作

4. vector容量和大小

5 vector插入和删除

6 vector数据存取

7 vector互换容器

8 vector预留空间


1 vector基本概念

功能:

○vector数据结构和数组非常相似,也称为单端数组

vector与普通数组区别:

○不同之处在于数组是静态空间,而vector可以动态扩展

动态扩展:

○并不是在原空间之后续接新空间,而是找更大的内存空间,然后将原始数据拷贝新空间,释放原空间

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

2 vector构造函数

功能描述:

○创建vector容器

函数原型:

○vector<T> v; //采用模板实现类实现,默认构造函数

○vector(v.begin(), v.end()); //将v[begin(),end()]区间中的元素拷贝给本身

○vector(n, elem);                          //构造函数将n个elem拷贝给本身

○vector(const vector &vec); //拷贝构造函数

  1. #include<iostream>
  2. using namespace std;
  3. #include<vector>
  4. //vector容器构造
  5. void printVector(vector<int> &v)
  6. {
  7. for (vector<int>::iterator it = v.begin(); it != v.end();it++)
  8. {
  9. cout << *it << " ";
  10. }
  11. cout << endl;
  12. }
  13. void test01()
  14. {
  15. vector<int> v1; //默认构造 无参构造
  16. for (int i = 0; i < 10; i++)
  17. {
  18. v1.push_back(i);
  19. }
  20. printVector(v1);
  21. //通过区间方式进行构造
  22. vector<int> v2(v1.begin(), v1.end());
  23. printVector(v2);
  24. //n个elem方式构造
  25. vector<int> v3(10, 100);
  26. printVector(v3);
  27. //拷贝构造
  28. vector<int> v4(v3);
  29. printVector(v4);
  30. }
  31. int main(){
  32. test01();
  33. system("pause");
  34. return 0;
  35. }

总结:vector的多种构造方式没有可比性,灵活使用即可

3 vector赋值操作

功能描述:

○给vector容器进行赋值

函数原型:

○vector& operator=(const vector &vec); //重载等号操作符

○assign(beg, end); //将[beg,end]区间中的数据拷贝赋值给本身

○assign(n,elem); //将n个elem拷贝赋值给本身

  1. #include<iostream>
  2. using namespace std;
  3. #include<vector>
  4. void printVector(vector<int> &v)
  5. {
  6. for (vector<int>::iterator it = v.begin(); it != v.end();it++)
  7. {
  8. cout << *it << " ";
  9. }
  10. cout << endl;
  11. }
  12. //vector赋值
  13. void test01()
  14. {
  15. vector<int> v1;
  16. for (int i = 0; i < 10; i++)
  17. {
  18. v1.push_back(i);
  19. }
  20. printVector(v1);
  21. //赋值
  22. vector<int> v2;
  23. v2 = v1;
  24. printVector(v2);
  25. //asign
  26. vector<int> v3;
  27. v3.assign(v1.begin(); v1.end());
  28. printVector(v3);
  29. //n个elem 方式赋值
  30. vector<int> v4;
  31. v4.assign(10, 100);
  32. printVector(v4);
  33. }
  34. int main(){
  35. test01();
  36. system("pause");
  37. return 0;
  38. }

总结:vector赋值方式比较简单,使用operator=,或者assign都可以

4. vector容量和大小

功能描述:

○对vector容器的容量和大小操作

函数原型:

○empty(); //判断容器是否为空

○capacity(); //容器的容量

○size(); //返回容器中元素的个数

○resize(int num); //重新指定容器的长度num,若容器变长,则以默认值填充新位置,如果容器变短,则末尾超出容器长度的元素被删除。

○resize(int num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置,如果容器变短,则末尾超出容器长度的元素被删除。

  1. #include<iostream>
  2. using namespace std;
  3. #include<vector>
  4. void printVector(vector<int> &v)
  5. {
  6. for (vector<int>::iterator it = v.begin(); it != v.end();it++)
  7. {
  8. cout << *it << " ";
  9. }
  10. cout << endl;
  11. }
  12. //vector容器的容量和大小操作
  13. void test01()
  14. {
  15. vector<int> v1;
  16. for (int i = 0; i < 10; i++)
  17. {
  18. v1.push_back(i);
  19. }
  20. printVector(v1);
  21. if(v1.empty()) //为真 代表容器为空
  22. {
  23. cout << "v1 is empty" << endl;
  24. }
  25. else
  26. {
  27. cout << "v1 is not empty" << endl;
  28. cout << "v1's capacity is : " << v1.capacity() << endl;
  29. cout << "v1's size is : " << v1.size() << endl;
  30. }
  31. //重新指定大小
  32. v1.resize(18, 100); //利用重载版本,可以指定默认值填充,参数2
  33. printVector(v1); //如果重新指定的比原来长了,默认用0填充新的位置
  34. v1.resize(5);
  35. printVector(v1);//如果重新指定的比原来的短了,超出部分会删除掉
  36. }
  37. int main(){
  38. test01();
  39. system("pause");
  40. return 0;
  41. }

总结:

○判断是否为空——empty

○返回元素个数——size

○返回容器容量——capacity

○重新指定大小——resize

5 vector插入和删除

功能描述:

○对vector容器进行插入、删除操作

函数原型:

○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(); //删除容器中所有元素

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

总结:

尾插——push_back

尾删——pop_back

插入——Insert(位置迭代器)

删除——erase(位置迭代器)

清空——clear

6 vector数据存取

功能描述:

○对vector中的数据的存取操作

函数原型:

○at(int idx); //返回索引idx所指的数据

○operator[]; //返回索引idx所指的数据

○front(); //返回容器中第一个数据元素

○back(); //返回容器中最后一个数据元素

  1. #include<iostream>
  2. using namespace std;
  3. #include<vector>
  4. //vector容器 数据存取
  5. void test01()
  6. {
  7. vector<int> v1;
  8. for (int i = 0; i < 10;i++)
  9. {
  10. v1.push_back(i);
  11. }
  12. //利用[]方式访问数组中元素
  13. for (int i = 0; i < v1.size();i++)
  14. {
  15. cout << v1[i] << " ";
  16. }
  17. cout << endl;
  18. //利用at方式访问元素
  19. for (int i = 0; i < v1.size();i++)
  20. {
  21. cout << v1.at(i) << " ";
  22. }
  23. cout << endl;
  24. //获取第一个元素
  25. cout << "the first element is : " << v1.front() << endl;
  26. //获取最后一个元素
  27. cout << "the last element is : " << v1.back() << endl;
  28. }
  29. int main(){
  30. test01();
  31. system("pause");
  32. return 0;
  33. }

总结:

○除了用迭代器获取vector容器中元素,[]和at也可以

○front返回容器第一个元素

○back返回容器最后一个元素

7 vector互换容器

功能描述:

○实现两个容器内元素进行互换

函数原型:

○swap(vec); //将vec与本身的元素互换

  1. #include<iostream>
  2. using namespace std;
  3. #include<vector>
  4. //vector容器互换
  5. void printVector(vector<int> &v)
  6. {
  7. for (vector<int>::iterator it = v.begin(); it != v.end();it++)
  8. {
  9. cout << *it << " ";
  10. }
  11. cout << endl;
  12. }
  13. //1、基本使用
  14. void test01()
  15. {
  16. vector<int> v1;
  17. for (int i = 0; i < 10;i++)
  18. {
  19. v1.push_back(i);
  20. }
  21. cout << "before change" << endl;
  22. printVector(v1);
  23. vector<int> v2;
  24. for (int i = 10; i >0 ;i--)
  25. {
  26. v2.push_back(i);
  27. }
  28. printVector(v2);
  29. cout << "after change" << endl;
  30. v1.swap(v2);
  31. printVector(v1);
  32. printVector(v2);
  33. }
  34. //2、实际用途
  35. //巧用swap可以收缩内存空间
  36. void test02()
  37. {
  38. vector<int> v;
  39. for (int i = 0; i < 10000; i++)
  40. {
  41. v.push_back(i);
  42. }
  43. cout << "v's capacity is : " << v.capacity() << endl;
  44. cout << "v's size is : " << v.size() << endl;
  45. v.resize(3); //重新指定大小
  46. cout << "v's capacity is : " << v.capacity() << endl;
  47. cout << "v's size is : " << v.size() << endl;
  48. //巧用swap收缩内存
  49. vector<int>(v).swap(v);
  50. cout << "v's capacity is : " << v.capacity() << endl;
  51. cout << "v's size is : " << v.size() << endl;
  52. }
  53. int main(){
  54. test01();
  55. test02();
  56. system("pause");
  57. return 0;
  58. }

总结:

swap可以使两个容器进行互换,可以达到实用的收缩内存的效果

(需要使用匿名对象,匿名对象的特点即执行完当前行后就消失,系统将内存收回)

8 vector预留空间

功能描述:

○减少vector在动态扩展容量时的扩展次数

函数原型:

○reserve(int len); //容器预留len个元素长度,预留位置不初始化,元素不可访问。

  1. #include<iostream>
  2. using namespace std;
  3. #include<vector>
  4. //vector容器 预留空间
  5. void test01()
  6. {
  7. vector<int> v;
  8. //利用reserve预留空间
  9. v.reserve(100000);
  10. int num = 0; //统计开辟次数
  11. int *p = NULL;
  12. for (int i = 0; i < 100000; i++)
  13. {
  14. v.push_back(i);
  15. if( p != &v[0])
  16. {
  17. p = &v[0];
  18. num++;
  19. }
  20. }
  21. cout << "num = " << num << endl;
  22. }
  23. int main(){
  24. test01();
  25. system("pause");
  26. return 0;
  27. }

总结:如果数据量较大,可以一开始利用reserve预留空间

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/714448
推荐阅读
  

闽ICP备14008679号