C++拾遗(一)vector

Vector 容器的相关补充

关于 .end()

定义

.end() 指向容器最后一个元素的后一位置

空容器的 .begin().end()

对于空容器而言,.begin().end() 指向同一个位置

vector vec; // 一个空容器

if (vec.begin() == vec.end()) {
    // 此判断为真
}

访问 .end() 所指的元素(很多时候)是合法的

虽然 .end() 并不对应容器中的任何值,对它的引用也通常没有意义

但是若容器不为空,则对该尾部迭代器的引用依然是合法的

vector vec; // 一个空容器

cout << *(vec.end()); // 非法。此时容器为空

vec.push_back(32); // 为其填入一个值

cout << *(vec.end()) // 合法

迭代器的显式和隐式声明

显式声明迭代器

vector<int>::iterator iter; // 一个用于指向 `vector` 类型容器的迭代器
const vector<int>::iterator iter; // 只读权限

C++11 及以上版本中利用自动类型推导

auto iter = vec.begin();
const auto iter = vec.begin();

迭代器之间的关系运算

只有 vectorqueue 支持除 !=== 之外的关系运算,包括

iter = iter + n; // 使用 + 或 - 使迭代器一次移动大于一个位置

iter = iter1 - iter2; // 迭代器之间的距离

if (iter1 > iter2) {
    // 迭代器所指位置的先后关系
}

迭代器失效

vectorstringdeque 插入元素可能使得指向该容器的所有迭代器失效。
以下面的容器为例

vector vec;
vec = {1, 2, 3};
auto it = vec.begin();
it++; // 此时指向元素 2

auto t = it + 1; // 此时t指向元素 3

迭代器不受影响

存储空间未被重新分配,且插入位置在迭代器所指元素之后

vec.reverse(10); // 为容器预先分配空间,使得容器不需要在每次增长时都重新分配空间
vec.push_back(4);

cout << *it; // 正常输出 2
cout << *t; // 不会报错,但是输出不再是元素 3 

迭代器受影响

存储空间被重新分配,或插入位置在迭代器之前都可能导致迭代器受到影响
一个解决方案是使用 insert() 进行插入,它将返回插入元素所在位置的迭代器。

auto r = vec.insert(vec.end(), 5);
cout << *r; // 正常输出 5

你可能感兴趣的:(C++拾遗,c++,开发语言,后端)