本文共 1299 字,大约阅读时间需要 4 分钟。
像所有的标准关联容器一样,set和multiset按照一定的顺序来存放自己的元素,而这些容器的正确行为也是建立在其原始保存有序的基础之上的。如果把关联容器中的一个元素的值改变了,那么,新的值可能不在正确的位置上,这将会打破容器的有序性。
直接修改map、multimap的值,不能通过编译,因为他们的元素类型实际为std::pair<const K, V>,因为键的类型是const K,所以不能修改。
直接修改map、multimap的键行不通,但是修改set、multiset的键却是可行的。其元素类型为T而非const T。
有一个雇员类;class Employee{ public: ... const std::string& name() const; void SetName(const std::string& name); const std::string& title() const; void SetTitle(const std::string& title); int idNumber() const; ...}
创建一个使用id进行排序的set:
auto sortFunc = [](const Employee& lhs, const Employee& rhs) { return lhs.idNumber() < rhs.idNumber(); };std::setdatas;
datas以Employee的id进行排序,只要不修改id,datas的排序就不会改变,所以set、multiset的键为T而不是const T。
因为set或multiset中的值不是const,所以,对这些值进行修改的代码可以通过编译。如果你修改set或multiset中的元素,请记住,一定不要改变键部分-元素的这部分信息会影响容器的排序性。如果改变了这部分内容,那么你可能会破坏该容器,再使用该容器将导致不确定的结果,而错误的责任在于你。
如果想以一种总是可行而且安全的方式来修改set、muliset、map、multimap中的元素,则可以分5个简单步骤来进行:
例如,将datas中键为“WorldPeace”的元素修改为“HelloWorld”:
auto iter = datas.find("WorldPeace");if (iter != datas.end()){ auto curData = *iter; curData.setName("HelloWorld"); datas.erase(iter); datas.insert(curDatas);}
转载地址:http://waqgz.baihongyu.com/