当前位置:   article > 正文

【C++】STL容器-vector_c++中vector的结构是什么

c++中vector的结构是什么

目录

 

一.vector介绍

二.vector初始化

1.初始化vector的方法

2.vector拷贝vector对象

3.列表初始化(花括号)

4.值初始化(圆括号)

5. 列表初始化和值初始化注意点

三.向vector对象中添加元素

1.什么时候使用值初始化?

2.push_back()方法

3.不能使用下标添加元素

四.其他vector操作

五. vector与vector::iterator

1.二者关系

2.begin和end操作

六.遍历vector的方法

1.用迭代器遍历输出容器中的元素

2.使用STL算法for_each()

七.vector存放自定义数据类型

1.vector存放class类型

2.vector存放指针类型

八.vector嵌套vector容器

九.vector的数据结构 


一.vector介绍

vector是STL(标准模板库)中的一个序列式容器,本质是一个类模板

每一个STL库都需要包含对应的头文件,所以使用vector第一步是:

#include <vector>

vector和数组的区别是:vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间容纳新元素。

vector也可以解释为单端数组

二.vector初始化

1.初始化vector的方法

初始化vector对象的方法
vector<T> v1v1是一个空vector,元素类型为T,执行默认初始化
vector<T> v2(v1)把v1的元素拷贝给v2
vector<T> v2=v1把v1的元素拷贝给v2
vector<T> v3(n,val)v3包含了n个重复的元素,每个元素的值都是val
vector<T> v4(n)v4包含了n个重复的元素,每个元素的值都是0
vector<T> v5{a,b,c,...}v5包含了列表中个数的元素,每个元素对应相应的值
vector<T> v6={a,b,c,...}和上面v5等价

2.vector拷贝vector对象

允许把一个vector对象元素拷贝给另一个vector对象,注意两个vector对象的类型必须相同。

  1. vector<T> v2(v1) //把v1的元素拷贝给v2
  2. vector<T> v2(v1.begin(),v1.end()) //把v1的[brgin,end)前闭后开数据拷贝给v2
  3. vector<T> v2=v1 //把v1的元素拷贝给v2,重载运算符=

3.列表初始化(花括号)

  1. vector<T> v5{a,b,c,...} //v5包含了列表中个数的元素,每个元素对应相应的值
  2. vector<T> v6={a,b,c,...} //和上面v5等价

4.值初始化(圆括号)

  1. vector<T> v3(n,val) //v3包含了n个重复的元素,每个元素的值都是val
  2. vector<T> v4(n) //v4包含了n个重复的元素,每个元素的值都是0

5. 列表初始化和值初始化注意点

(1) 如果提供的书初始值列表,则只能把初始值放在花括号中进行列表初始化,不能放进圆括号中

vector<string> v7("a","b","c") //错误!不能用圆括号初始化值列表

(2) 花括号中的值与元素类型不同,会尝试用值初始化列表

vector<string> v8{10,"hi"} //转换使用值初始化

三.向vector对象中添加元素

1.什么时候使用值初始化?

(1)初始值已知且数量较少

(2)初始值是另外一个vector对象的副本

(3)所有元素初始值都一样

但是当元素各不相同且数量很多时,值初始化就不方便了。

2.push_back()方法

  1. vector<int> v1; //创建一个空vector
  2. for(i=0;i!=100;i++)
  3. {
  4. v1.push_back(i); //依次添加到v1的尾端
  5. //循环后v1有100个元素,0-99
  6. }

3.不能使用下标添加元素

  1. vector<int> v2; //创建一个空vector
  2. v2[0] = 1; //错误!

只能用下标读取元素

四.其他vector操作

        引用黑马程序员C++教程中的图:

         为什么capacity()>=size() 参考九.vector的数据结构 

vector支持的操作
v.empty();v中不含任何元素,返回真;否则返回假
v.size();返回v中元素个数
v1.assign(v2.begin(), v2.begin()+3);赋值:将v2的0~2个元素构成的向量赋给v1
v.assign(4,2)赋值:v只含4个元素,且每个元素为2
v.back();返回v的最后一个元素
v.front();返回v的第一个元素

v[i];

返回v的第i个元素,当且仅当v[i]存在

v.clear();

清空v中的元素

v.pop_back(); 

删除v向量的最后一个元素

v.erase(v.begin()+1,v.begin()+3);

删除v中第1个(从第0个算起)到第2个元素

v.insert(v.begin()+1,5);

在v的第1个元素(从第0个算起)的位置插入数值5,如v为1,2,3,4,插入元素后为1,5,2,3,4

v.insert(v.begin()+1,3,5);

在v的第1个元素(从第0个算起)的位置插入3个数,其值都为5

v.insert(v.begin()+1,b+3,b+6);

//b为数组,在v的第1个元素(从第0个算起)的位置插入b的第3个元素到第5个元素

v.capacity();

返回v在内存中总共可以容纳的元素个数
v.resize(10);将v的现有元素个数调至10个,多则删,少则补,其值随机

v.resize(10,2);

将v的现有元素个数调至10个,多则删,少则补,其值为2

v.reserve(100);

将v的容量(capacity)扩充至100
v1.swap(v2);v2为向量,将v1中的元素和v2中的元素进行整体性交换

v1==v2;

v2为向量,向量的比较操作还有!=,>=,<=,>,<

五. vector与vector::iterator

1.二者关系

每种容器类型都定义了自己的迭代器类型,如vector:

vector<int>::iterator iter;

vector<int>是声明向量容器;
例如 verctor<int> v,就是创建了一个名字叫v的向量容器。

vector<int>::iterator是定义向量迭代器
例如,vector<int>::iterator iter  就是定义了一个名字叫iter 的向量迭代器

iter 实质上是一个迭代器指针,访问时需要解引用*iter,解引用后的数据类型和<int>相同。

2.begin和end操作

每种容器都定义了一对命名为begin和end的函数,用于返回迭代器。如果容器中有元素的话,由begin返回指向第一个元素的迭代器

  1. vector<int>::iterator iter = v.begin();
  2. //这条语句把迭代器iter初始化为由名为begin的vector操作的返回值。如果vector非空,初始化后,iter即指该元素为v[0]

由end操作返回的一个指向vector的末端元素的下一个迭代器。称为“超出末端迭代器”,表明它指向了一个不存在的元素。如果噢vector为空,begin返回的迭代器与end返回的迭代器相同。 

  1. //用迭代器遍历输出容器中的元素
  2. 容器名::iterator iter;
  3. for(iter = 容器.begin();iter != 容器.end();iter++)
  4. {
  5. cout << *iter << ' ';
  6. }

六.遍历vector的方法

1.用迭代器遍历输出容器中的元素
 

  1. std::vector<int>::iterator iter;
  2. for(iter = v.begin();iter != v.end();iter++)
  3. {
  4.     cout << *iter << ' ';
  5. }

2.使用STL算法for_each()

引入头文件

#include <algorithm>
  1. void myPrint(int val)
  2. {
  3. cout<<val<<endl;
  4. }
  5. for_each(v.begin,v.end,myPrint) //myPrint回调函数

七.vector存放自定义数据类型

it实质上是一个迭代器指针,访问时需要解引用*it,解引用后的数据类型和<Person>相同。

1.vector存放class类型

  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. using namespace std;
  5. class Person
  6. {
  7. public:
  8. Person(string name, int age)
  9. {
  10. this->m_name = name;
  11. this->m_age = age;
  12. }
  13. string m_name;
  14. int m_age;
  15. };
  16. int main()
  17. {
  18. vector<Person> v;
  19. Person p1("Mike", 20);
  20. Person p2("Simth", 21);
  21. Person p3("Lily", 22);
  22. v.push_back(p1);
  23. v.push_back(p2);
  24. v.push_back(p3);
  25. for (vector<Person>::iterator it = v.begin(); it != v.end(); it++)
  26. {
  27. //cout << "姓名:" << (*it).m_name<< endl;
  28. cout << "姓名:" << it->m_name<< endl;
  29. cout << "年龄:" << it->m_age<< endl;
  30. }
  31. system("pause");
  32. return 0;
  33. }

2.vector存放指针类型

  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. using namespace std;
  5. class Person
  6. {
  7. public:
  8. Person(string name, int age)
  9. {
  10. this->m_name = name;
  11. this->m_age = age;
  12. }
  13. string m_name;
  14. int m_age;
  15. };
  16. int main()
  17. { //存放指针类型
  18. vector<Person*> v;
  19. Person p1("Mike", 20);
  20. Person p2("Simth", 21);
  21. Person p3("Lily", 22);
  22. //&取地址符
  23. v.push_back(&p1);
  24. v.push_back(&p2);
  25. v.push_back(&p3);
  26. for (vector<Person*>::iterator it = v.begin(); it != v.end(); it++)
  27. {
  28. //cout << "姓名:" << *(*it).m_name<< endl;
  29. cout << "姓名:" << (*it)->m_name<< endl;
  30. cout << "年龄:" << (*it)->m_age<< endl;
  31. }
  32. system("pause");
  33. return 0;
  34. }

八.vector嵌套vector容器

这种嵌套关系有点类似于二维数组。主要还是要注意(*it)<==>vector<int>,(*vit)<==>int

  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4. int main()
  5. {
  6. vector<vector<int>> v;
  7. //创建小容器
  8. vector<int> v1;
  9. vector<int> v2;
  10. vector<int> v3;
  11. //向小容器中添加数据
  12. for (int i = 0; i < 5; i++)
  13. {
  14. v1.push_back(i + 1);
  15. v2.push_back(i + 2);
  16. v3.push_back(i + 3);
  17. }
  18. //将小容器插入到大容器中
  19. v.push_back(v1);
  20. v.push_back(v2);
  21. v.push_back(v3);
  22. //通过大容器把所有数据遍历一遍
  23. for (vector<vector<int>>::iterator it = v.begin(); it != v.end(); it++)
  24. {
  25. //(*it)的类型是vector<int>
  26. for (vector<int>::iterator vit = (*it).begin(); vit != (*it).end(); vit++)
  27. {
  28. //(*vit)的类型是int
  29. cout << (*vit) << " ";
  30. }
  31. cout << endl;
  32. }
  33. system("pause");
  34. return 0;
  35. }

九.vector的数据结构 

16a1aa0292594f3b8984d99848f265a5.jpg

参考《C++ primer》、《STL源码剖析》等。

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

闽ICP备14008679号