Vector不清晰点学习&易错点

什么是迭代器

  • 是一个广义指针
  • 它可以是指针,也可以是一个可对其执行类似指针得操作-如解除引用(如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;
}

  • 这段代码的基本释义就是计算一个数组的平均值,下面打印的结果
  • 29.1
  • 这是因为,函数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();
}

29.2

VS注释快捷键
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值