在 boost::bimap 中移动值
Shift values in boost::bimap
我有一个像这样的无序双映射:
using SymPressMap =
boost::bimap<boost::bimaps::unordered_set_of<sym>,
boost::bimaps::unordered_set_of<Press>>;
这基本上是 "sym" 和 "Press" 之间的双射。我想循环"Presses"的子集,如图:bimap state before and after
这是使用 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)));
}
}
基本思想是连续交换相邻("syms")元素。但我收到此错误:
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 studio17\professional\vc\tools\msvc.16.27023\include\utility 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
键是一个常见的困难和混乱领域,这是因为键定义了容器的结构(哪些值放在哪个桶中)。
你在这里遇到了同样的问题,那就是你试图修改存储在容器中的键(你是在交换值方面这样做,但在双映射中当然键和值是对偶的) .你不能那样做。您可以做的是复制键值对,交换它们的值,从容器中删除原始键值对,然后插入修改后的键值对。
参考:
我有一个像这样的无序双映射:
using SymPressMap =
boost::bimap<boost::bimaps::unordered_set_of<sym>,
boost::bimaps::unordered_set_of<Press>>;
这基本上是 "sym" 和 "Press" 之间的双射。我想循环"Presses"的子集,如图:bimap state before and after
这是使用 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)));
}
}
基本思想是连续交换相邻("syms")元素。但我收到此错误:
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 studio17\professional\vc\tools\msvc.16.27023\include\utility 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
键是一个常见的困难和混乱领域,这是因为键定义了容器的结构(哪些值放在哪个桶中)。
你在这里遇到了同样的问题,那就是你试图修改存储在容器中的键(你是在交换值方面这样做,但在双映射中当然键和值是对偶的) .你不能那样做。您可以做的是复制键值对,交换它们的值,从容器中删除原始键值对,然后插入修改后的键值对。
参考: