我们的编码指南更喜欢const_iterator,因为它们比正常情况下快一点iterator.看起来编译器会在您使用时优化代码const_iterator.
这真的是对的吗?如果是的话,内部真正发生的事情会变得const_iterator更快吗?
编辑:我写了一个小测试来检查const_iteratorvs iterator,发现不同的结果:
对于迭代10,000个对象const_terator,花费几毫秒(大约16毫秒).但并非总是如此.有两次相等的迭代.
我正在考虑关于const和非const类方法的这个问题.首选答案取自Scott Meyers的Effective C++,其中非const方法是根据const方法实现的.
进一步扩展,如果方法返回迭代器而不是引用,如何减少代码重复?修改链接问题中的示例:
class X
{
    std::vector<Z> vecZ;    
public:
    std::vector<Z>::iterator Z(size_t index)
    {
        // ...
    }
    std::vector<Z>::const_iterator Z(size_t index) const
    {
        // ...
    }
};
我不能在const方法方面实现非const方法,因为不使用distance()/ advance()技术就无法直接从const_iterator转换为迭代器.
在这个例子中,因为我们使用std :: vector作为容器,所以实际上可以从const_iterator转换为迭代器,因为它们很可能被实现为指针.我不想依赖于此.有更通用的解决方案吗?
好的,我做了一些研究,显然在这个主题上有很多关于SO的重复问题,仅举几例:
但是我忍不住再提一下,因为
auto -typed返回值,我实际上是复制函数体,唯一的区别是const函数限定符.const版本和非const版本可能返回彼此完全不相容的类型.在这种情况下,斯科特迈耶斯的const_cast习语,以及"非const功能返回非const"技术都不会起作用.举个例子:
struct A {
    std::vector<int> examples;
    auto get() { return examples.begin(); }
    auto get() const { return examples.begin(); }
};  // Do I really have to duplicate?
    // My real-world code is much longer
    // and there are a lot of such get()'s
在这种特殊情况下,auto get()返回一个iteratorwhile auto get() const返回一个const_iterator,并且两个不能相互转换(我知道erase(it,it) …
根据这个问题,并假设我对容器本身有一个可变引用,则可以使用以下方法安全地删除迭代器的常量性:
foo::const_iterator cit = ... ;
foo::iterator it = c.erase( cit, cit );
但是,根据此代码,这似乎不适用于forward_list的等效项erase_after::
#include <iostream>
#include <forward_list>
typedef std::forward_list<int>::const_iterator CIT;
typedef std::forward_list<int>::iterator IT;
int main()
{
    std::forward_list<int> m{1, 2, 3};
    CIT cit = m.begin();
    IT it = m.erase_after(cit, cit); // Segmentation fault!
    std::cout << *it;
}
那么有没有办法删除这个类的const迭代器的constness?最好不是通过迭代!