为什么不修改关联容器的键
Why not modify key of associative container?
我知道在关联容器中更改对象的键是一个糟糕的主意,但我想知道标准究竟在哪里禁止我这样做。考虑:
#include <map>
#include <memory>
struct X { int i; };
struct lt
{
bool operator()( const std::shared_ptr< X >& lhs,
const std::shared_ptr< X >& rhs ) const
{
return lhs->i < rhs->i;
}
};
int main()
{
std::map< std::shared_ptr< X >, int, lt > m;
auto x = std::make_shared< X >();
x->i = 1;
m.insert( std::make_pair( x, 2 ) );
x->i = 42; // change key wrt the container!
}
我认为上述内容应该是非法的,但是我已经阅读了一段时间的标准,我找不到任何真正使其非法的东西。它在哪里?还是隐藏在将来的缺陷报告中?
如果在根据指定的比较器更改后,任何两个键的比较不同的方式来修改值,则会在程序中注入未定义的行为。
根据C++11标准([associaciative.reqmts](第23.2.4/3段:
短语"键的等效性"是指比较所强加的等价关系,而不是
operator==
钥匙上。也就是说,如果用于比较,则k1
和k2
两个键被认为是等效的 对象comp
,comp(k1, k2) == false && comp(k2, k1) == false
。对于任意两个键,k1
和k2
同一容器,调用comp(k1, k2)
应始终返回相同的值。
相关文章:
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 独立读取-修改-写入顺序
- 当系统的卷被修改时,如何修改WASAPI环回捕获卷
- 修改函数中的指针(将另一个指针作为参数传递)
- 为什么我可以通过引用修改常量返回
- 对于结构,表达式必须是可修改的ivalue
- QML:修改在不同QML文件(而非main.QML)中定义的子对象的属性
- 关联容器的下界复杂性:成员函数与非成员函数
- 为什么不能修改对象中的值?另外,我如何改进此链表?
- 修改创建帐户程序
- 我应该如何修改此代码以使用给定字符串中的字母打印菱形图案
- 如何从子成员函数修改父公共成员变量
- 修改 VS Code 中的默认C++代码段
- 为什么在我的函数类型后使用引用运算符 (&) 允许我修改它返回的值?
- 如何使用递归打印修改后的星号三角形图案
- 已修改的LinkedList未在文本文件本身中更新
- std::future_error:无关联状态
- C++RapidXml-使用first_node()遍历以修改XML文件中节点的值
- C++标准是否保证失败的插入到关联容器中不会修改 rvalue-reference 参数?
- 为什么不修改关联容器的键