首页 > 解决方案 > 为什么 c++ 顺序访问迭代器的函数签名不使用指针?

问题描述

例如在这个片段 beg & end 中,似乎被用作指针。然而在函数声明 In *beg 中,In *end 既不提供也不被 c++ 编译器接受。为什么我们像指针一样使用它而不像函数的指针参数一样声明它?

#include <vector>
#include <algorithm>
#include <iostream>
#include <iterator>
using namespace std;

template<class In, class X> void myreplace (In beg, In end, const X& x, const X& y)
{
    while (beg != end)
    {
        if (*beg == x) *beg = y;
        beg++;
    }
}

int main()
{
    vector<int> veca = { 1, 3, 4, 4, 1, 4, 4 };
    myreplace(veca.begin(), veca.end(), 4, 2);
    copy(veca.begin(), veca.end(), ostream_iterator<int>(cout, ","));
}

标签: c++pointersiterator

解决方案


迭代器通常不仅仅是指针,而是指针的抽象。

根据他们的一般要求

它们的语义是 C++ 中大多数指针语义的概括。这确保了每个采用迭代器的函数模板都可以与常规指针一起工作

所以你也可以这样做:

myreplace(&veca[0], &veca[6], 4, 2);

其中&veca[0]&veca[6]是指向向量的第一个和最后一个元素的指针veca

这是可能的,因为[] 运算符返回对指定位置元素的引用。


推荐阅读