分享

【精选】【C++数据结构】vector_c++ vector 结构体

 wuxinit_ 2023-11-07 发布于湖北

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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多