【问题标题】:Shift values in boost::bimapboost::bimap 中的移位值
【发布时间】:2020-02-08 19:58:15
【问题描述】:

我有一个像这样的无序 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)));
  }
}

基本思想是连续交换相邻的(就“符号”而言)元素。但我收到了这个错误:

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));
}

【问题讨论】:

    标签: c++ boost c++14 boost-bimap


    【解决方案1】:

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

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

    参考:How to change the key in an unordered_map?

    【讨论】:

    • 谢谢。虽然如果无序 bimap 基于两个映射,交换可以更有效:只需交换两个映射中的值
    • 一个的 value_type 将是另一个的 mapped_type,因此通常无法交换它们(在您的示例用例中也没有)。
    • 当 bimap 基于两个映射时,不需要移位键:在第一个映射中,值顺时针移位,在第二个映射中,值是逆时针移位。因此,钥匙“留在”它们的位置。
    猜你喜欢
    • 1970-01-01
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    • 1970-01-01
    相关资源
    最近更新 更多