标准库类型vector笔记

本文主要介绍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 初始化

可以对 vector 对象直接初始化;或者先定义为一个空的对象,在运行时再用 push_back 添加具体值。前一种情况适用于:

  1. 初始值已知并且数量较少;
1
vector<int> ivec{1,2,3,4,5}; ////列表初始化
  1. 初始值是另一个 vector 对象的副本;
1
vector<int> ivec = ivec1;
  1. 所有元素的初始值都一样;
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;
}

访问 vector 的元素

  1. 利用 范围for 遍历 vector 的所有元素。
  2. 利用下标访问 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_backvector添加元素,该操作会使迭代器失效。

迭代器运算符:

所有的迭代器都支持 ==!= 运算符, vectorstring 支持更多的运算如下:

iter + n ////得到当前迭代器位置超前原来迭代器n个位置
iter - n
iter += n
iter -= n
iter1 - iter2 ////返回两个迭代器的距离,类型是一个带符号类型: difference_type
>, <, >=, <= ////所在位置前后的比较,必须在同一个容器对象中比较才有意义。
updatedupdated2019-12-282019-12-28