STL之vector

STL之vector 向量

vector是一个多功能的、能够操作多种数据结构和算法的模板类和函数库。

vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据

向量可将元素存储在连续的内存位置中,并在运行时根据需要分配内存

vector和array的区别

数组array遵循静态方法,这意味着在运行时不能更改其大小,而vector实现动态数组意味着在添加元素时会自动调整其大小。

vector基础使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <vector>

// 创建vector
// vector<object_type> v1;

using namespace std;
int main()
{
vector<string> v1;
v1.push_back("C++ STL");
v1.push_back("VECTOR");
for (vector<string>::iterator itr = v1.begin(); itr != v1.end(); ++itr)
{
cout << *itr << endl;
}
return 0;
}

vector的常用成员函数

  • at(idx) : 传回索引idx所指向的数据,如果idx越界,抛出out_of_range;
  • back() : 返回最后一个元素,不检查这个数据是否存在;
  • front() : 返回第一个元素,不检查这个数据是否存在;
  • swap() : 交换两个vector;
  • push_back() : 在vector的末尾追加一个元素;
  • pop_back() : 在vector中删除最后一个元素;
  • empty() : 判断vector是否为空,为空则返回true;
  • insert() : 在指定位置插入新元素;
  • erase() : 删除指定的元素???
  • resize() : 修改vector的大小;
  • clear() : 从vector中删除所有元素;
  • size() : 返回vector的元素个数;
  • capacity() : 返回vector在不重新分配内存的情况下,当前最多可以容纳的元素个数;
  • assige() : 将新值分配给vector;
  • operator=() : 将新值分配给vector容器;
  • operator : 访问指定的元素;
  • end() : 返回最末尾元素的迭代器;
  • emplace() : 在位置pos之前,插入一个新的元素;
  • emplace_back() : 在末尾插入一个元素;
  • rend() : 指向vector的第一个元素之前的元素;
  • rbegin() : 指向vector的最后一个元素;
  • begin() : 返回第一个元素的迭代器;
  • max_size() : 返回vector所能容纳的元素的最大数量(上限值);
  • cend() : 指向vector中的last-last-element;
  • cbegin() : 指向vector的第一个元素;
  • crbegin() : 指向vector的最后一个字符;
  • crend() : 指向vector第一个元素之前的元素;???
  • data() : 将vector的数据写入array;
  • shrink_to_fit() : 减小vector的容量,使它等于vector的大小;

val = v1.at(idx)

返回索引位置的值,和v1[idx]一样;

栗子:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <vector>

using namespace std;
int main()
{
vector<int> v1{1, 2, 3, 4};
for (int i = 0; i < v1.size(); i++)
{
cout << v1.at(i) << endl;
}
return 0;
}

val = v1.back()

返回最后一个元素,不管存在不存在,v1.end()考虑下差别;

  • v1.back()返回最后一个元素;
  • v1.front()返回第一个元素;

栗子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <vector>

using namespace std;
int main()
{
vector<string> v1{
"begin",
"middle",
"end",
};

cout << v1.back() << endl;
cout << v1.front() << endl;
return 0;
}
// 发现一个问题:string居然区分单引号双引号,必须双引号才可以!

v1.swap(v2)

交换两个vector中的元素;

如果两个vector的size不一样,会自动扩容,因为vector的长度可变。

栗子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v1 = {1, 2, 3, 4, 5};
vector<int> v2 = {6, 7, 8, 9, 10, 11};
cout << "在交换之前,v1的元素是 :";
for (int i = 0; i < v1.size(); i++)
cout << v1[i] << " ";
cout << '\n';
cout << "在交换之前,v2的元素是 :";
for (int i = 0; i < v2.size(); i++)
cout << v2[i] << " ";
cout << '\n';
v1.swap(v2);
cout << "交换后,v1的元素为 :";
for (int i = 0; i < v1.size(); i++)
cout << v1[i] << " ";
cout << '\n';
cout << "交换后,v2的元素为 :";
for (int i = 0; i < v2.size(); i++)
cout << v2[i] << " ";
return 0;
}
作者

Gavin

发布于

2022-03-22

更新于

2022-03-22

许可协议

CC BY-NC-SA 4.0

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×