C++ boost::bimap中的移位值

C++ boost::bimap中的移位值,c++,boost,c++14,boost-bimap,C++,Boost,C++14,Boost Bimap,我有一个无序的bimap,如下所示: using SymPressMap = boost::bimap<boost::bimaps::unordered_set_of<sym>, boost::bimaps::unordered_set_of<Press>>; 其基本思想是连续交换相邻(以“符号”的形式)元素。但我得到了一个错误: Error C2678 binary '=': no operator fou

我有一个无序的bimap,如下所示:

using SymPressMap =
    boost::bimap<boost::bimaps::unordered_set_of<sym>,
                 boost::bimaps::unordered_set_of<Press>>;
其基本思想是连续交换相邻(以“符号”的形式)元素。但我得到了一个错误:

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 studio\2017\professional\vc\tools\msvc\14.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));
}

对于常规无序映射,交换
映射的\u类型
值没有问题,因为容器结构不依赖于这些值。但是修改
key\u类型
键是一个常见的困难和混淆区域,这是因为键定义了容器的结构(哪些值放在哪个桶中)

这里也有同样的问题,即您试图修改存储在容器中的键(您是在交换值方面进行的,但在bimap中,键和值当然是对偶的)。你不能那样做。您可以做的是复制键值对,交换它们的值,从容器中删除原始值,然后插入修改后的键值对


参考:

谢谢。虽然如果未排序的bimap基于两个映射,交换可能会更有效:只需交换两个映射中的值。其中一个映射的值类型将是另一个映射的值类型,因此通常无法交换它们(在您的示例用例中也是如此)。当bimap基于两个映射时,无需移动键:在第一个贴图中,值顺时针移动,在第二个贴图中,值逆时针移动。因此,键“停留”在它们的位置上。
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));
}