C语言中的vector和迭代器是什么?

摘要:本文用通俗易懂的方式讲解C++中vector容器和迭代器的使用方法,包括vector的初始化、元素操作,以及如何用迭代器遍历序列。
迭代器 (iterator),顾名思义就是能够遍历一组对象的东西。 但是在讲解它之前,我们需要先了解迭代的对象是什么。常见的一种,叫做 vector。 vector 类型 使用可变有序序列 我们知道,数学里,vector 是向量的意思。但 C++ 里的向量和它不太一样。它的含义是,具有可变元素个数的有序对象序列。 之所以这里说的是对象序列,是因为 vector 可以存储任意类型的对象(我们通常称之为,泛型,即广泛的类型)。 #include <vector> //先引入一下 vector<int> v; vector<string> v2; vector<double> v3; 看看上面的代码,这下看懂了。先声明 vector,再用尖括号包裹 vector 存储的数据类型。 OK 现在我们有了空的对象序列。是时候向其中存入元素了。 int i = 10; v.push_back(i); 使用 .push_back(),允许我们向对象序列的末尾加入元素。由于它是可变长度的,所以可以随意加入对象。 有一点需要注意,vector 永远不会存储引用。也就是说,它会创建圆括号中的对象的拷贝(或者移动该对象)。 你应该已经了解过 string 或者 数组 了。与它们类似,我们也可以用下标运算符,来获取其中某个元素的引用(注意下标从 0 开始,且你不能超过已有元素的范围)。比如: v.push_back(i); ... v[5] = 10; // 修改第 6 个元素 要想知道一共有多少元素,避免超出,可以用 size()。不过它返回的是 size_type,你可以用 auto 自动判断类型。 auto vsize = v.size(); // 自动判断返回值类型 初始化问题 我们之前都是先创建空的 vector,然后再装入对象。实际上,我们也可以直接初始化 vector。 vector<int> v1{1, 2}; // 1,2 vector<int> v2(2); // 0,0 vector<int> v3(2,3); // 3,3 如上,初始化有花括号(列表初始化)和圆括号(值初始化)两种方式。如果是花括号,那么其中的对象列表就会被加入到 vector 中。比如第一行就初始化了一个包含 2 个数字的 vector。 而如果是圆括号,那么分两种情况: 如果只输入一个值,那么它会创建相应大小 vector,然后初始化所有值为对应对象的默认值(对于 int,这是 0) 如果输入两个值,那么会把第二个值复制,并根据第一个值确定元素个数,填充入 vector。比如第三行,2 个 3。 注意,初始化只是创建空白 vector 然后存入,并非固定了大小。也就是说,你还可以继续使用 push_back() 加入元素,来扩展其大小。 其实还有个特殊情况。如果花括号内的数据,无法用于初始化一个 vector,那么它会自动作为圆括号处理: vector<string> v{2}; // "","" vector<string> v1{2,"HELLO"}; // "HELLO","HELLO" 第一行创建了含有 2 个初始值的 string 对象的 vector,第二行则创建了含有 2 个 "HELLO" 的 string 对象的 vector。 实际上,如果你不需要快速创建多个相同的元素,你没有任何理由去用初始化。你可以创建空的 vector,然后随意动态添加元素。 还有一点需要注意。可以直接把一个 vector 复制到另一个: vector<int> v2; v2 = v1; //OK 迭代器 好了,既然我们已经有了一个对象的集合,让我们进入正题吧。 vector<int> v1 = {1,2,3,4,5}; for(auto it = v1.begin();it!=v1.end();it++){ cout<<*it<<endl; } // 输出一行一个 v1 中的元素 等等等,上面的代码有些复杂,我们一点点解释,顺便说明什么是迭代器。 第一行,创建了一个含有 5 个元素的 vector。 然后用了一个 for 语句—— 什么是迭代器? 首先是初始化: auto it = v1.begin(); 这就是我们的主角,迭代器。我们用了自动类型判断,实际上 it 的类型是:vector<int>::iterator,也就是说,vector 有一个迭代器,而 vector 其中存储的对象是 int 类型的。
阅读全文