在提升::bimap中移位值

Shift values in boost::bimap

本文关键字:bimap      更新时间:2023-10-16

我有一个这样的无序双映射:

using SymPressMap =
boost::bimap<boost::bimaps::unordered_set_of<sym>,
boost::bimaps::unordered_set_of<Press>>;

这基本上是"sym"和"Press"之间的双射。我想循环"按"的子集,如图片所示:bimap 状态前后

以下是使用 std::unordered_map 编译但使用 bimap 失败的算法:

void Layout::cycle(SymVector syms) {
assert(syms.size() >= 2);
for (auto it = syms.rbegin(); it != syms.rend() - 1; it++) {
std::swap(sympressmap.left.at(*it), sympressmap.left.at(*(it + 1)));
}
}

基本思想是连续交换相邻的(就"符号"(元素。但是我收到此错误:

Error   C2678   binary '=': no operator found which takes a left-hand operand of type '_Ty' (or there is no acceptable conversion)  
KeyboardOptimizer   c:program files (x86)microsoft visual studio2017professionalvctoolsmsvc14.16.27023includeutility  68  

所以,问题是如何交换bimap中的两个元素?

UPD:擦除插入版本,感谢John Zwinck,它编译

void Layout::cycle(SymVector syms) {
assert(syms.size() >= 2);
Press plast = pressmap.left.at(*syms.rbegin());
pressmap.left.erase(*syms.rbegin());
for (auto it = syms.rbegin() + 1; it != syms.rend(); it++) {
auto p = pressmap.left.at(*it);
pressmap.left.erase(*it);
pressmap.left.insert(SymPressMap::left_value_type(*(it - 1), p));
}
pressmap.left.insert(SymPressMap::left_value_type(*syms.begin(), plast));
}

对于常规unordered_map,交换mapped_type值没有问题,因为容器结构不依赖于它们。 但是修改key_type键是一个常见的困难和混乱领域,因为键定义了容器的结构(哪些值在哪些存储桶中(。

您在这里遇到同样的问题,即您正在尝试修改存储在容器中的键(您是在交换值方面执行此操作的,但在 bimap 中,键和值当然是对偶的(。 你不能这么做。 您可以做的是复制键值对,交换其值,从容器中删除原始文件,然后插入修改后的键值对。

参考:如何在unordered_map中更改密钥?