相关疑难解决方法(0)

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_iterators更喜欢迭代器吗?

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

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

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

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

c++ iterator stl const-iterator

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

从const和返回迭代器的非const方法中删除代码重复

我正在考虑关于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
    {
        // ...
    }
};
Run Code Online (Sandbox Code Playgroud)

我不能在const方法方面实现非const方法,因为不使用distance()/ advance()技术就无法直接从const_iterator转换为迭代器.

在这个例子中,因为我们使用std :: vector作为容器,所以实际上可以从const_iterator转换为迭代器,因为它们很可能被实现为指针.我不想依赖于此.有更通用的解决方案吗?

c++ const dry

9
推荐指数
2
解决办法
1181
查看次数

避免使用auto关键字复制const和非const的代码?

好的,我做了一些研究,显然在这个主题上有很多关于SO的重复问题,仅举几例:

但是我忍不住再提一下,因为

  1. 使用 auto -typed返回值,我实际上是复制函数体,唯一的区别是const函数限定符.
  2. 这是可能的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
Run Code Online (Sandbox Code Playgroud)

在这种特殊情况下,auto get()返回一个iteratorwhile auto get() const返回一个const_iterator,并且两个不能相互转换(我知道erase(it,it) …

c++ c++14

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

C++ const_iterator to iterator for forward_list

根据这个问题,并假设我对容器本身有一个可变引用,则可以使用以下方法安全地删除迭代器的常量性:

foo::const_iterator cit = ... ;
foo::iterator it = c.erase( cit, cit );
Run Code Online (Sandbox Code Playgroud)

但是,根据此代码,这似乎不适用于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;
}
Run Code Online (Sandbox Code Playgroud)

那么有没有办法删除这个类的const迭代器的constness?最好不是通过迭代!

c++

3
推荐指数
1
解决办法
140
查看次数

标签 统计

c++ ×5

const-iterator ×2

iterator ×2

stl ×2

c++14 ×1

const ×1

dry ×1