c++ - 将 const 容器引用作为参数传递时如何逃脱 const_iterator 陷阱

标签 c++ stl iterator constants

我通常更喜欢 constness,但最近遇到了一个关于 const 迭代器的难题,动摇了我对 const 的态度,这让我很恼火:

MyList::const_iterator find( const MyList & list, int identifier )
{
    // do some stuff to find identifier
    return retConstItor; // has to be const_iterator because list is const
}

当然,我想在这里表达的想法是,传入的列表不能/不会被更改,但是一旦我使列表引用 const,我就必须使用“const_iterator”,这会阻止我 < strike>doing anything with 修改结果(这是有道理的)。

那么,解决方案是放弃使传入的容器引用成为常量,还是我错过了另一种可能性?

这一直是我对 const 的 secret 保留意见:即使你正确使用它,它也会产生不应该出现的问题,因为没有好的/干净的解决方案,尽管我认识到这更具体地说是一个问题const 和迭代器概念。

编辑:我非常清楚为什么不能也不应该为常量容器返回非常量迭代器。我的问题是,虽然我想对通过引用传入的容器进行编译时检查,但我仍然想找到一种方法来传回某些东西的位置,并用它来修改列表的非常量版本.正如其中一个答案中提到的,可以通过“提前”提取这个位置概念,但很麻烦/效率低下。

最佳答案

如果我理解你说的是正确的,你正在尝试使用 const 向调用者表明你的函数不会修改集合,但你希望调用者(可能有对集合的非 const 引用),以便能够使用您返回的迭代器修改集合。如果是这样,我认为没有一个干净的解决方案,除非容器提供一种机制将 const interator 转换为非 const interator(我是不知道执行此操作的容器)。您最好的选择可能是让您的函数采用非 const 引用。你也可以对你的函数进行 2 次重载,一个 const 和一个非 const,这样在调用者只有一个 的情况下const 引用,他们仍然可以使用你的函数。

关于c++ - 将 const 容器引用作为参数传递时如何逃脱 const_iterator 陷阱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1557352/

相关文章:

迭代整数位的 Pythonic 方法

loops - 展开向量中的(开始,结束)对

c++ - 无法使用 Visual Studio 2019.7.2 编译虚幻引擎 4.25

c++ - struct 中的 std::list 导致内存冲突错误

C++ 没有根据需要将数字/数字插入 vector 中

function - C++ : using class member and static function of same name but different parameters fails

rust - 如何在未知大小的 Vec<Vec<T>> 上创建一个迭代器,该迭代器相当于内部 Vec<T> 迭代器的笛卡尔积?

c++ - 使用带有 adjacency_list 的通用类型

c++ - 如何将多个 multimap 中的数据链接在一起(C++)?

c++ - 字符串类没有转换运算符