boost_multi_index 迭代器取消引用给出 const

boost_multi_index iterator dereference gives const

这与取消引用 boost_multi_index hashed_index 迭代器有关。请看下面的代码:

using namespace boost;
using namespace boost::multi_index;
using Container = boost::multi_index_container<
    std::string,
    indexed_by<hashed_unique<const_mem_fun<std::string, size_t, &std::string::size>>>>;

Container container;
auto& hash_map = container.get<0>();
auto[it, inserted] = hash_map.insert("1234");
if (!inserted)
    *it = "1234";

给出:

error: no match for 'operator=' (operand types are 'const value_type {aka const std::__cxx11::basic_string<char>}' and 'const char [5]')
         *it = "1234";
               ^~~~~~

因此,看起来可以只调用迭代器引用的对象上的 const 方法 it

  1. 为什么要这样做? (容器是否能够跟踪所有变化?)
  2. 是否有better/another写入引用对象的方法?

Boost.MultiIndex 迭代器是 const(不会让您对元素进行非常量访问)因为否则值可能会在所有者 multi_index_container 不知情的情况下更改,这将导致元素错位,未定义的行为等。例如,这与 std::set 中的迭代器的情况相同。

要修改元素,讨论了各种工具 here。请注意,该文档是 C++11 之前的文档,并没有提到将 lambda 表达式与 modify 结合使用,它看起来像:

hash_map.modify(it,[](std::string& x){x="1234";});