Сдвиг значений в boost :: bimap - PullRequest
2 голосов
/ 08 февраля 2020

У меня есть неупорядоченный двунитка, подобный этому:

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

Основная идея c заключается в последовательном обмене соседними (в терминах "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 studio\2017\professional\vc\tools\msvc\14.16.27023\include\utility  68  

Итак, вопрос Как поменять два элемента в bimap? .

UPD: версия для стирания и вставки спасибо Джону Цвинку, который составляет

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

1 Ответ

1 голос
/ 09 февраля 2020

С обычным unordered_map обмен значениями mapped_type не является проблемой, поскольку структура контейнера не зависит от них. Но изменение ключей key_type - это общая область трудностей и путаницы, которая возникает из-за того, что ключи определяют структуру контейнера (значения go в которых сегменты).

У вас та же проблема, это то, что вы пытаетесь изменить ключи, хранящиеся в контейнере (вы делаете это с точки зрения обмена значениями, но в bimap конечно ключи и значения являются двойными). Вы не можете сделать это. Что вы можете сделать, это скопировать пары ключ-значение, поменять их местами, удалить оригиналы из контейнера и вставить измененные пары.

Ref: Как изменить ключ в unordered_map?

...