У меня есть неупорядоченный двунитка, подобный этому:
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));
}