【C++数据结构】vector

  • Post author:
  • Post category:其他




vector 的常见用法

vector 是“变长数组”,即“长度根据需要而自动改变的数组”。



1. 头文件

#include <vector>



2. vector 的定义

vector<typename> name;

这里的typename可以是任何基本类型,如:int、double、char、结构体、STL标准容器等。


【注意】如果typename也是STL容器,定义的时候要记得在>>符号之间加上空格。

vector<int> name;
vector<node> name;  // node是结构体的类型
vector<vector<int> > name;  // >>之间要加空格



3. vector 数组的定义

vector<typename> Arrayname[arraySize];

这样

Arrayname[0]~Arrayname[arraySize-1]

中每一个都是一个vector容器。一般用这种方式实现图的边存储。



vector<vector<int> > name

不同的是,这种写法其中一维长度已经固定为 arraySize,另一维才是“变长”的。



4. vector 容器内元素的访问



(1)通过下标访问

和访问普通数组一样,对一个定义为

vector<typename> vi

的 vector 容器来说,直接访问

vi[index]

即可,这里下标是从0到vi.size()-1。



(2)通过迭代器访问

定义迭代器:

vector<typename>::iterator it;

这样可以得到迭代器 it,可以通过指针*it来访问 vector 里的元素。

添加容器元素:

vector<int> vi;
for(int i=1;i<=5;++i) 
	vi.push_back(i);  // 在末尾添加元素i

可以通过类似下标和指针访问数组的方式来访问容器内的元素:

vector<int>::iterator it = vi.begin();  // vi.begin()取vi的首元素地址,而it指向这个地址
for(int i=0;i<5;++i) 
	printf("%d ", it[i]));  // 1 2 3 4 5


【注意】

vi[i]



*(vi+i)



*(vi.begin()+i)



vi.begin()[i]

是等价的。


end()

函数是取尾元素地址的下一个地址,作为迭代器末尾的标志,不存储任何元素。

for(vector<int>::iterator it = vi.begin();it!=vi.end();it++)
	printf("%d ", *it); // 1 2 3 4 5

vector 的迭代器不支持

it<vi.end()

写法,因此循环条件只能用

it!=vi.end()



(4)通过逆向迭代器访问

for(vector<int>::reverse_iterator it = vi.rbegin();it!=vi.rend();it++) 	
	printf("%d ", *it); // 5 4 3 2 1



5. vector 常用函数实例解析



(1)push_back()

在 vector 后面添加一个元素 x,时间复杂度为 O(1)。

vector<int> vi;
for(int i=1;i<=3;++i) vi.push_back(i);  // 将1、2、3依次插入vi末尾



(2)pop_back()

删除 vector的尾元素,时间复杂度为 O(1)。

vector<int> vi;
for(int i=1;i<=3;++i) vi.push_back(i);  // 将1、2、3依次插入vi末尾
vi.pop_back();  // 删除vi的尾元素3



(3)size()

获得 vector 中元素的个数,时间复杂度为 O(1)。size()返回的是 unsigned 类型。

vector<int> vi;
for(int i=1;i<=3;++i) vi.push_back(i);  // 将1、2、3依次插入vi末尾
printf("%d\n", vi.size()); //3



(4)clear()

清空 vector 中的所有元素,时间复杂度为 O(N)。

vector<int> vi;
for(int i=1;i<=3;++i) vi.push_back(i);  // 将1、2、3依次插入vi末尾
vi.clear();



(5)insert()

insert(it, x)用来向 vector 的任意迭代器 it 处插入一个元素 x,时间复杂度 O(N)。

vector<int> vi;
for(int i=1;i<=5;++i) vi.push_back(i);  // 此时为1 2 3 4 5
vi.insert(vi.begin()+2, -1);  // 将-1插入vi[2]的位置,此时为1 2 -1 3 4 5



(6)erase()


① 删除单个元素


erase(it)

即删除迭代器为it处的元素.

vector<int> vi;
for(int i=5;i<=9;++i) vi.push_back(i);  // 此时为5 6 7 8 9
vi.erase(vi.begin()+3);  // 删除8,此时为5 6 7 9


② 删除一个区间内所有元素



mp.erase(first, last)

即删除左闭右开区间[first, last)内所有元素。

vector<int> vi;
for(int i=5;i<=9;++i) vi.push_back(i);  // 此时为5 6 7 8 9
vi.erase(vi.begin()+1, vi.begin()+4);  // 删除vi[1]、vi[2]、vi[3],此时为5 9

如果要删除这个 vector 内的所有元素,正确的写法应该是

vi.erase(vi.begin(), vi.end()),vi.end()

就是尾元素地址的下一个地址。更方便的是使用

vi.clear()



(7) empty()

返回是否 vector 为空。

vector<int> vi;
for(int i=1;i<=5;++i) 
	vi.push_back(i); 
if (g1.empty() == false)
      cout << "Vector is not empty";
  else
      cout << "Vector is empty";

结果为:

Vector is not empty



(8) assign()

用于给 vector 赋值


① 当参数为数值的时候



assign(int x, typename y)

就是给 vector 赋值 为 x 个 y。此时会改变 vector 的 size()

vector<int> vt;
vt.assign(7, 4);
for (int i = 0; i < vt.size(); i++){
    cout<<vt[i]<<" ";
}
cout<<endl;
vt.assign(5, 3);
for(int i=0; i<vt.size(); i++){
    cout<<vt[i]<<" ";
}
cout<<endl;

结果:

4 4 4 4 4 4 4

3 3 3 3 3


② 当参数为迭代器或者指针时



assign(typename* x, typename* y)

,就是将[x, y)范围内的内容给 vector 初始化,会改变 size()。

vector<int> v1;
int a[] = { 1, 2, 3 };

// assign first 2 values
v1.assign(a, a + 2);

cout << "Elements of vector1 are\n";
for (int i = 0; i < v1.size(); i++)
    cout << v1[i] << " ";

vector<int> v2;
// assign first 3 values
v2.assign(a, a + 3);

cout << "\nElements of vector2 are\n";
for (int i = 0; i < v2.size(); i++)
    cout << v2[i] << " ";

结果为:

Elements of vector1 are

1 2

Elements of vector2 are

1 2 3

vector<int> v;
v.assign(7, 100);

cout << "Size of first: " << int(v.size()) << '\n';

cout << "Elements are\n";
for (int i = 0; i < v.size(); i++)
    cout << v[i] << " ";
    
// modify the elements
v.assign(v.begin(), v.begin() + 3);

cout << "\nModified VectorElements are\n";
for (int i = 0; i < v.size(); i++)
    cout << v[i] << " ";
cout<<endl;

结果为:

Size of first: 7

Elements are

100 100 100 100 100 100 100

Modified VectorElements are

100 100 100


③当参数为数组时



assign({x1, x2, ...})

直接将 vector 初始化为该数组

vector<int> v; 
// Initialize v with an initialization list
v.assign({ 1, 2, 3 });
cout << "The list is:" << endl;
for (auto i = v.begin(); i != v.end(); i++)
{
    // Printing 1 2 3 as output
    cout << *i << " ";
}

结果为:

The list is:

1 2 3



(9) swap()

用于交换两个 vector

vector<int> v1, v2;
v1.push_back(1);
v1.push_back(2);
v2.push_back(3);
v2.push_back(4);

cout << "Vector 1: ";
for (int i = 0; i < v1.size(); i++)
    cout << v1[i] << " ";

cout << "\nVector 2: ";
for (int i = 0; i < v2.size(); i++)
    cout << v2[i] << " ";

// Swaps v1 and v2
v1.swap(v2);

cout << "\nAfter Swap \nVector 1: ";
for (int i = 0; i < v1.size(); i++)
    cout << v1[i] << " ";

cout << "\nVector 2: ";
for (int i = 0; i < v2.size(); i++)
    cout << v2[i] << " ";

结果:

Vector 1: 1 2

Vector 2: 3 4

After Swap

Vector 1: 3 4

Vector 2: 1 2



版权声明:本文为weixin_43441566原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。