本文主要介绍c++标准库中 vector 的基本用法。
本文主要记录:
-
vector 的初始化
-
访问 vector 的元素
-
迭代器
标准库类型 vector表示对象的集合,其中的所有对象的类型都相同, vector 是一个类模板而不是类型,需要提供额外的信息给编译器将 vector 实例化,比如:
1
2
|
vector<int> ivec;
vector<vector<string>> file;
|
vector 常用操作:
1
2
3
4
5
6
7
8
9
|
v.empty()
v.size()
v.push_back(t)
v[n]
v1 = v2 ////拷贝
v1 = {a,b,c...}
v1 == v2 ////当且仅当它们元素个数和元素值都相同
v1 != v2
< ,V= ,> ,>= ////以字典顺序比较
|
可以对 vector 对象直接初始化;或者先定义为一个空的对象,在运行时再用 push_back 添加具体值。前一种情况适用于:
- 初始值已知并且数量较少;
1
|
vector<int> ivec{1,2,3,4,5}; ////列表初始化
|
- 初始值是另一个 vector 对象的副本;
1
|
vector<int> ivec = ivec1;
|
- 所有元素的初始值都一样;
1
|
vector<int> ivec(10,1); ////初始化为10个1
|
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
26
27
28
29
30
|
// cpp_practice.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <vector>
#include <string>
#include <iostream>
using std::vector;
using namespace std;
int main()
{
vector<string> int_str;
string str;
char cont = 'y';
while (cin >> str)
{
int_str.push_back(str);
cout << "continue ?'y or n'" << endl;
cin >> cont;
if (cont == 'n' || cont == 'N')
break;
}
for (auto i : int_str)
{
cout << i << endl;
}
return 0;
}
|
- 利用 范围for 遍历 vector 的所有元素。
- 利用下标访问 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
26
27
28
29
30
31
32
33
|
#include "stdafx.h"
#include <vector>
#include <string>
#include <iostream>
using std::vector;
using namespace std;
int main()
{
vector<int> ivec;
for (decltype(ivec.size())ix = 0; ix != 10; ix++)
{
ivec.push_back(ix); ////初始化为空的 vector 用 push_back 添加元素
}
for (auto &i : ivec)
{
i *= 2; ////范围for,需要用引用的格式修改其中的元素的值。
}
for (decltype(ivec.size())ix = 0; ix != 10; ix++)
{
ivec[ix] += 1; ////利用下标访问已经存在的元素,显然易见,空vector不可使用下标方式访问
}
for (auto i : ivec)
{
cout << i << endl;
}
return 0;
}
|
标准库中的所有容器和 string 都可以使用迭代器访问对象的元素,迭代器常用的成员:
1
2
|
iter.begin(); ////返回指向对象第一个元素的迭代器
iter.end(); ////返回对象尾元素的下一个位置的迭代器,该位置为空,不可对该位置的元素进行解引。
|
利用迭代器遍历对象中的元素:
1
2
3
4
5
6
|
string str{ "some string" };
for(auto s = str.begin(); s != str.end(); ++s)
{
*s = toupper(*s);
}
cout << str << endl;
|
若对象只需读操作而不需要写操作,可用 iter.cbegin() 和 iter.cend() 来访问对象中元素,这样返回的会是一个 const_iterator ,不论访问的对象本身是不是常量对象。
但凡使用了迭代器的循环体,都不要向迭代器所属容器添加元素!
比如不能用 push_back 向 vector添加元素,该操作会使迭代器失效。
迭代器运算符:
所有的迭代器都支持 == , != 运算符, vector 和 string 支持更多的运算如下:
iter + n ////得到当前迭代器位置超前原来迭代器n个位置
iter - n
iter += n
iter -= n
iter1 - iter2 ////返回两个迭代器的距离,类型是一个带符号类型: difference_type
>, <, >=, <= ////所在位置前后的比较,必须在同一个容器对象中比较才有意义。