C++ —— 关于vector

迷迭所归处 2024-10-03 17:05:02 阅读 95

目录

链接

1. vector的定义

2. vector的构造

3. vector 的遍历

4. vector 的扩容机制

5. vector 的空间接口

5.1 resize 接口  

 5.2 push_back

5.3 insert 

5.4 erase

5.5 流插入与流提取  

vector 并不支持流插入与流提取,但是可以自己设计,更加灵活方便

6. vector 的不同类型元素 


链接

cplusplus.com/reference/vector/vector/

icon-default.png?t=O83A

https://cplusplus.com/reference/vector/vector/


1. vector的定义

(constructor)构造函数声明 接口说明
vector() 无参构造
vector(size_type n, const value_type& val =

value_type())

构造并初始化n个val
vector (const vector& x); 拷贝构造
vector (InputIterator first, InputIterator last); 使用迭代器进行初始化构


 

2. vector的构造

<code>//模版类只能显式实例化

vector<int> v1;

vector<int> v2(10, 1);

//迭代器初始化

vector<int> v3(v2.begin(), v2.end());

vector<int> v4(++v2.begin(), --v2.end());

 


3. vector 的遍历

vector 与 string 的遍历相同,并且做了更多的优化

void test_vector1()

{

vector<int> v1;

vector<int> v2(10, 1);

vector<int> v3(++v2.begin(), --v2.end());

//下标遍历

for (size_t i = 0; i < v3.size(); i++)

{

cout << v3[i] << " ";

}

cout << endl;

//迭代器遍历

vector<int>::iterator it = v3.begin();

while (it != v3.end())

{

cout << *it << " ";

++it;

}

cout << endl;

// 范围 for 遍历

for (auto e : v3)

{

cout << e << " ";

}

cout << endl;

}


4. vector 的扩容机制

vector 的扩容机制在 VS 环境下是1.5倍扩容,在 g++ 环境下是2倍扩容,和string相同

但是有一点不同:

那就是string 的 reverse 接口如果给出的值小于原来的容量那么就可能会缩容,但是 vector 的 reverse 接口如果给出一个小于原容量的值就不会缩容

 

void TestVectorExpend()

{

size_t sz;

vector<int> v;

sz = v.capacity();

cout << "capacity changed :" << sz << "\n";

cout << "make a grow" << endl;

for (size_t i = 0; i < 100; i++)

{

v.push_back(i);

if (sz != v.capacity())

{

sz = v.capacity();

cout << "capacity changed :" << sz << "\n";

}

}

}


5. vector 的空间接口

size 获取数据个数
capacity 获取容量大小
empty 判断是否为空
resize 改变vector的size
reserve  改变vector的capacity

5.1 resize 接口  

 resize 接口是在原来 vector 对象的基础上进行添加数据

当然有两种情况:

一种是添加数据容量小于原来的size,就会减小size的值而不改变capacity的值(容量不变)

第二种情况就是大于size的值,就会根据给定的值来扩容

<code>vector<int> v(10, 1);

cout << v.size() << endl;

cout << v.capacity() << endl;

//小于size

v.resize(5, 2);

cout << v.size() << endl;

cout << v.capacity() << endl;

//大于size

v.resize(15, 2);

cout << v.size() << endl;

cout << v.capacity() << endl;

 

void test_vector3()

{

//10个整形数据1

vector<int> v(10, 1);

//申请20空间

v.reserve(20);

cout << v.size() << endl;

cout << v.capacity() << endl;

//10个整形数据1,补上5个整形数据2

v.resize(15, 2);

cout << v.size() << endl;

cout << v.capacity() << endl;

//10个整形数据1,5个整形数据2,补上10个整形数据3

v.resize(25, 3);

cout << v.size() << endl;

cout << v.capacity() << endl;

//只保留5个数据

v.resize(5);

cout << v.size() << endl;

cout << v.capacity() << endl;

}

 


                                                通常 vector 支持迭代器插入


 5.2 push_back

//尾插

vector<int> v(10, 1);

v.push_back(10);

for (auto e : v)

{

cout << e << " ";

}

cout << endl;


5.3 insert 

//头插

vector<int> v(10, 1);

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

for (auto e : v)

{

cout << e << " ";

}

cout << endl;

//第一个数+3之后在第三个位置进行插入

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

for (auto e : v)

{

cout << e << " ";

}


5.4 erase

删除指定位置的数据

//头删

vector<int> v(10, 1);

v.erase(v.begin());

for (auto e : v)

{

cout << e << " ";

}

cout << endl;

//第一个数+3之后删除第三个位置的数据

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

for (auto e : v)

{

cout << e << " ";

}

cout << endl;

 


5.5 流插入与流提取  

vector 并不支持流插入与流提取,但是可以自己设计,更加灵活方便

vector<int> v(10);

for (size_t i = 0; i < v.size(); i++)

{

cin >> v[i];

}

for (auto e : v)

{

cout << e << " ";

}

cout << endl;


6. vector 的不同类型元素 

vector不光可以存储int,double类型,还可以存储日期类,string,自定义类型,甚至还可以存储vector(也就是存储二维数组)

 

vector<vector<int>>:二维数组存放整数类型

 

 

 

<code>

//二维数组

//5个元素的一维数组

vector<int> v(5, 1);

//开辟一个10行5列的二维数组

vector<vector<int>> vv(10, v);

vv[2][1]=1;

//这两段代码的意思是相同的

//vv.operator[](2)operator[](1)=2;

 遍历

//二维数组

//5个元素的一维数组

vector<int> v(5, 1);

//开辟一个10行5列的二维数组

vector<vector<int>> vv(10, v);

//使用下标遍历二维数组

for (int i = 0; i < vv.size(); i++)

{

for (int j = 0; j < v.size(); j++)

{

cout << vv[i][j] << " ";

}

cout << endl;

}

 

 


感谢观看~



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。