首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么std::remove需要常量版本的迭代器?

为什么std::remove需要常量版本的迭代器?
EN

Stack Overflow用户
提问于 2015-05-14 23:34:32
回答 2查看 121关注 0票数 1

我正在使用Visual Studio 2013编译非常简单的代码:

代码语言:javascript
复制
std::set<int> a{ 1, 2, 3 };
std::remove(a.begin(), a.end(), 3);

我希望这不会出错,但我很惊讶。错误信息:

代码语言:javascript
复制
Error   1   error C3892: '_Next' : you cannot assign to a variable that is const    c:\program files (x86)\microsoft visual studio 12.0\vc\include\algorithm

这怎么可能呢?A是一个非常数std::set。remove()移动它的元素,看起来是完全合法的。

在VS2008中,下面类似的代码编译没有错误:

代码语言:javascript
复制
std::set<int> a;
std::remove(a.begin(), a.end(), 3);
EN

回答 2

Stack Overflow用户

发布于 2015-05-14 23:36:31

该集合是非常数,但为set::begin(),则set::end()返回const_iterator。可以看到on cppreference

我相信这是为了避免“局外人”能够交换元素,因为set的不变量之一是所有元素都是排序的(这正是std::remove所做的,它移动元素,以便您可以在之后调用erase,参见erase-remove idiom)

如果您想删除一个元素,请使用erase成员函数。

票数 4
EN

Stack Overflow用户

发布于 2015-05-14 23:38:22

std::remove适用于像vectorlist这样的线性容器,而不是像set这样的排序容器。(考虑:remove交换元素。交换set的元素意味着什么?)

听起来你想要std::set::erase

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30241347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档