【问题标题】:In C++, is "const_iterator" the same as "const iterator"?在 C++ 中,“const_iterator”是否与“const iterator”相同?
【发布时间】:2021-12-29 19:55:54
【问题描述】:

const_iterator 是否与const iterator 相同?如果不是有什么区别?如果是,为什么当const iterator 已经有意义时标准使用const_iterator

例如,这两个声明是否完全相同?

string& replace (const_iterator i1, const_iterator i2, const string& str);

string& replace (const iterator i1, const iterator i2, const string& str);

【问题讨论】:

  • 区别类似于const T * vs T * const vs const T * constconst_iterator 不能用于更改引用的事物,但您可以更改它引用的事物。 const iterator 可以改变被引用的东西,但你不能改变它引用的东西。
  • stackoverflow.com/questions/309581/… 这可能对你有帮助

标签: c++ iterator standards


【解决方案1】:

不,它们不一样。

像任何const 对象一样,您不能更改const iterator

// ++it gives error below since we try to change it:
for(const std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {}

但是,您可以更改 const iterator 指向的对象的值:

// this is ok (assuming there is at least one element in the vector):
const std::vector<int>::iterator it = vec.begin();
*it = 10;

const_iterator 是可变的,但不能改变迭代器指向的对象:

// ++it is ok below:
for(std::vector<int>::const_iterator it = vec.begin(); it != vec.end(); ++it) {
    *it = 10;   // error:  `*it`  is an `int const&`
}

使用const const_iterator,您既不能更改迭代器,也不能更改它所指向的内容。

const std::vector<int>::const_iterator it = vec.begin();
++it;                     // error
*it = 10;                 // error
std::cout << *it << '\n'; // ok

一个构造的例子来说明:

struct foo {
    using const_iterator = char const*;
    using iterator = char*;

    const_iterator cbegin() const { return data; };
    const_iterator cend() const { return data + sizeof data; };
    const_iterator begin() const { return cbegin(); }
    const_iterator end() const { return cend(); }
    iterator begin() { return data; };
    iterator end() { return data + sizeof data; };

    char data[2];
};

如上所示,const_iteratoriterator 是用户定义的类型定义。只有按照约定,名称才被称为它们的名称。使用这些常规名称也有助于创建应该与其他类一起工作的容器,因为这些类型定义通常用于创建或指定实例/类型。不过,名称 const_iteratoriterator 并没有赋予这些别名 any 特殊属性。这完全取决于课程的创建者。

【讨论】:

  • 那么我们可以说const_iterator ititerator const it 相同吗? const const_iterator itconst iterator const it 怎么样?
  • @Sadegg const_iterator ititerator const it 正如我试图描述的那样非常不同。也许const 的位置使它变得混乱?如果是这样的话,我同意。 const 适用于它的剩余部分。如果左边什么都没有,它适用于它右边的第一个东西。想出这个想法时,一定有人在做某事。
  • "const const_iterator itconst iterator const it 怎么样" - 它们也不同,第二个有多余的 const。由于我上面提到的令人困惑的规则,第二个中的 consts 都针对 iterator
猜你喜欢
  • 2017-12-06
  • 2019-10-30
  • 2012-05-10
  • 1970-01-01
  • 2015-01-16
  • 2021-05-10
  • 2014-05-12
  • 2020-02-24
  • 1970-01-01
相关资源
最近更新 更多