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
。
- 为什么要这样做? (容器是否能够跟踪所有变化?)
- 是否有better/another写入引用对象的方法?
Boost.MultiIndex 迭代器是 const(不会让您对元素进行非常量访问)因为否则值可能会在所有者 multi_index_container
不知情的情况下更改,这将导致元素错位,未定义的行为等。例如,这与 std::set
中的迭代器的情况相同。
要修改元素,讨论了各种工具 here。请注意,该文档是 C++11 之前的文档,并没有提到将 lambda 表达式与 modify
结合使用,它看起来像:
hash_map.modify(it,[](std::string& x){x="1234";});
这与取消引用 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
。
- 为什么要这样做? (容器是否能够跟踪所有变化?)
- 是否有better/another写入引用对象的方法?
Boost.MultiIndex 迭代器是 const(不会让您对元素进行非常量访问)因为否则值可能会在所有者 multi_index_container
不知情的情况下更改,这将导致元素错位,未定义的行为等。例如,这与 std::set
中的迭代器的情况相同。
要修改元素,讨论了各种工具 here。请注意,该文档是 C++11 之前的文档,并没有提到将 lambda 表达式与 modify
结合使用,它看起来像:
hash_map.modify(it,[](std::string& x){x="1234";});