标签: const-iterator

如何实现STL样式的迭代器并避免常见的陷阱?

我创建了一个集合,我想提供一个STL风格的随机访问迭代器.我正在寻找迭代器的示例实现,但我没有找到任何.我知道需要const重载[]*运算符.迭代器有什么要求是"STL风格",还有哪些其他缺陷需要避免(如果有的话)?

附加上下文:这是一个库,除非我真的需要,否则我不想引入任何依赖.我编写自己的集合,以便能够使用相同的编译器在C++ 03和C++ 11之间提供二进制兼容性(因此没有STL可能会破坏).

c++ iterator const-iterator

286
推荐指数
5
解决办法
17万
查看次数

如何正确实现自定义迭代器和const_iterators?

我有一个自定义容器类,我想写它iteratorconst_iterator类.

我之前从未这样做过,但我找不到合适的方法.关于迭代器创建的指导原则是什么,我应该注意什么?

我也想避免代码重复(我觉得const_iteratoriterator分享很多东西;应该是另一个子类吗?).

脚注:我很确定Boost有什么可以缓解的,但我不能在这里使用它,因为很多愚蠢的原因.

c++ iterator const-iterator

217
推荐指数
8
解决办法
17万
查看次数

cbegin/cend背后的原因是什么?

我想知道为什么cbegincend在C++ 11中引入?

什么情况下使用这些方法时,使得从常量重载的差异beginend

c++ iterator const-correctness const-iterator c++11

182
推荐指数
5
解决办法
5万
查看次数

const_iterator和iterator有什么区别?

这两个关于STL内部实现的区别是什么.性能有什么不同?我想当我们在"只读明智"中遍历矢量时,我们更喜欢const_iterator,对吧?

谢谢.

c++ iterator stl const-iterator

124
推荐指数
3
解决办法
10万
查看次数

如何删除const_iterator的constness?

作为扩展到这个问题const_iterators更快?,我有另一个问题const_iterators.如何删除一个常量const_iterator?虽然迭代器是指针的通用形式,但仍然const_iteratoriterators是两个不同的东西.因此,我相信,我也不能用来const_cast<>转换const_iteratoriterators.

一种方法可能是您定义一个迭代器,该迭代器将元素移动到该const_iterator点的元素.但这看起来像是一个线性时间算法.

对于实现这一目标的最佳方法有什么想法吗?

c++ iterator stl const-iterator

43
推荐指数
3
解决办法
2万
查看次数

const_iterators更快吗?

我们的编码指南更喜欢const_iterator,因为它们比正常情况下快一点iterator.看起来编译器会在您使用时优化代码const_iterator.

这真的是对的吗?如果是的话,内部真正发生的事情会变得const_iterator更快吗?

编辑:我写了一个小测试来检查const_iteratorvs iterator,发现不同的结果:

对于迭代10,000个对象const_terator,花费几毫秒(大约16毫秒).但并非总是如此.有两次相等的迭代.

c++ iterator stl const-iterator

35
推荐指数
6
解决办法
1万
查看次数

const_iterator与迭代器的比较是否定义明确?

请考虑以下代码:

#include <vector>
#include <iostream>

int main()
{
    std::vector<int> vec{1,2,3,5};
    for(auto it=vec.cbegin();it!=vec.cend();++it)
    {
        std::cout << *it;
        // A typo: end instead of cend
        if(next(it)!=vec.end()) std::cout << ",";
    }
    std::cout << "\n";
}
Run Code Online (Sandbox Code Playgroud)

在这里我介绍了一个错字:在比较中我打电话vec.end()而不是vec.cend().这似乎与gcc 5.2一样有效.但根据标准,它实际上是否定义明确?能iteratorconst_iterator安全地进行比较?

c++ iterator const-iterator comparison-operators

30
推荐指数
3
解决办法
2635
查看次数

新的std :: map :: erase()签名C++ 17

根据这个答案,iterator必须可以隐含地转换为const_iterator.insert_or_assign()既然如此,正如我们可以看到的那样,为什么在C++ 17中添加了新的签名std::map::erase()

在C++ 11中,我们有 iterator erase( const_iterator pos );

在C++ 17中,我们现在有了 iterator erase( iterator pos );

是不是C++ 11签名足以接收iteratorconst_iterator

c++ iterator const-iterator c++11 c++17

29
推荐指数
1
解决办法
909
查看次数

我应该比const_iterators更喜欢迭代器吗?

最近有人提出 Scott Meyers的文章说:

  • 身高iterators超过const_iterators(PDF链接).

其他人评论说这篇文章可能已经过时了.我想知道你的意见是什么?

这是我的:文章的一个要点是你不能删除或插入const_iterator,但我认为用它作为反对的论据很有趣const_iterators.我认为它的全部意义const_iterators在于你根本不修改范围,也不是通过插入或删除来替换它们的值或范围.或者我错过了什么?

c++ iterator stl const-iterator

27
推荐指数
2
解决办法
1万
查看次数

为什么const_iterator可以与std :: map :: erase一起使用

我下的印象,一个不能使用eraseconst iterator.检查此代码.
为什么以下代码编译(C++ 11,gcc)?

long getMax(const bool get_new)
{
    long max_val=0;

    TO now=getNow();

    map<TO, long>& m=get_new?m_new:m_old;

    for(auto it=m.cbegin(); it !=m.cend())
    {
        if(now.compareTime((*it).first)<lookback)
        {
            max_val=max(max_val,
                        (*it).second);
            ++it;
        }
        else
        {
            it=m.erase(it);
        }
    }

    return max_val;
}
Run Code Online (Sandbox Code Playgroud)

地图本身不是恒定的,但我的理解是,const iterator应该使这一失败.

c++ iterator stdmap const-iterator c++11

17
推荐指数
2
解决办法
889
查看次数