什么是迭代器
- 是一个广义指针
- 它可以是指针,也可以是一个可对其执行类似指针得操作-如解除引用(如operator*())和递增(operator++())
- STL中每个容器类都定义了一个合适的迭代器,该迭代器的类型是一个名为iterator的typedef,作用域是整个类
- 例如:为vector的double类型规范声明一个迭代器
vector<double>::iterator pd; // pd 一个迭代器
vector<double> scores;
pd = scores.begin(); // pd指向了第一个元素
*pd = 22.3;
++pd; // 让pd指向下一个元素
// 自动推到类型
auto pd = scores.begin();
- end()成员函数标识超过结尾的位置,是一个指向容器最后一个元素后面的那个元素
vector中一个我不熟悉的函数
- erase()方法删除了矢量中给定区间的元素,接受两个迭代器参数,这些参数定义了要删除的区间
- insert()方法功能与erase相反,接受3个迭代器参数,第一个参数指定了新元素插入位置,第二个和第三个迭代器定义了被插入的区间,该区间通常为另一个容器对象的一部分
vector<int> old_v;
vector<int> new_v;
...
old_v.insert(old_v.begin(), new_v.begin() + 1, new_v.end());
// 将矢量new_v中除了第一个元素外的所有元素插入到old_v矢量的第一个元素前面
常见的错误
1.先看一段代码
#include <iostream>
using namespace std;
double average1(int array[10])
{
double result = 0.0;
int len = sizeof(array) / sizeof(array[0]);
for (int i = 0; i < len; i++)
{
result += array[i];
}
return result / len;
}
int main()
{
std::cout << "Hello World!\n";
int array1[] = { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
int len = sizeof(array1)/sizeof(array1[1]);
cout << average1(array1) << endl;
}
- 这段代码的基本释义就是计算一个数组的平均值,下面打印的结果
- 这是因为,函数average1这个方法的参数是一个指针,不再是一个数组,所以sizeof(array) = sizeof(array[0]) = 4,其实就是一个指针得大小,这个问题就是“数组在做参数时的退化行为”,接下来改进,使用容器的方式
double average3(vector<int>& v)
{
double result = 0.0;
vector<int>::iterator it = v.begin();
// 或者是auto it = v.begin();
for (; it != v.end(); ++it)
{
result += *it;
}
return result / v.size();
}
VS注释快捷键