取消引用集合迭代器时将“字符串&”绑定到“常量字符串”时出错
Posted
技术标签:
【中文标题】取消引用集合迭代器时将“字符串&”绑定到“常量字符串”时出错【英文标题】:Error binding 'string&' to 'const string' when dereferencing a set iterator 【发布时间】:2017-12-01 14:48:35 【问题描述】:我正在使用 C++11 和 STL。我有这段代码:
std::set<std::string>::iterator it;
[...]
std::string &str = *it;
编译器抛出此错误:
错误:类型‘std::__cxx11::string& aka std::__cxx11::basic_string&’到‘const std::__cxx11::basic_string’的绑定引用丢弃了限定符
为什么会这样?
【问题讨论】:
set
只有const_iterator
s。删除它,然后插入一个新元素
C++ STL set update is tedious: I can't change an element in place的可能重复
或者如果您不想更改值,只需在std::string
之前添加const
如果它实际上是const_iterator,为什么要定义迭代器?是的,我需要修改它。我找不到这个帖子。对不起
你不能修改std::set
中的元素;那会打乱系列的秩序。如果您需要更改它,则必须将其删除并插入一个新的。
【参考方案1】:
set 或 map 中的键是 const。如果不是,则该集合将无法保证元素在键上是弱排序的。即当用户改变键时,它会变得莫名其妙地未排序。
std::set
迭代器取消对键的引用。键是(重申)常量。
可变引用不能绑定到 const 引用(语言强加的规则)。
因此,要么:
std::string const& str = *it; // refer to the key
或
std::string str = *it; // take a copy of the key
【讨论】:
好吧,但是如果它实际上是一个 const_iterator,为什么 C++ 定义迭代器呢? @class_OpenGL:这样就很容易迭代数据。iterator
本身并不意味着可变性
啊,好吧。谢谢!!
或者更具体地说,std::set<T>::iterator
和 std::set<T>::const_iterator
都存在以匹配所有其他容器模板的结构,它们不相同。同样std::set<T>::key_type
与std::set<T>::value_type
相同,std::set<T>::key_compare
与std::set<T>::value_compare
相同以上是关于取消引用集合迭代器时将“字符串&”绑定到“常量字符串”时出错的主要内容,如果未能解决你的问题,请参考以下文章
完成 GeneratorDataset 迭代器时发生错误:已取消:操作已取消
AngularJS:将布尔值绑定到单选按钮,以便在取消选中事件时将模型更新为 false