Boost: доступ к растровому изображению с помощью оператора[]

В следующем коде:

typedef bimap< set_of< std::string >, list_of< int > > bm_type;
bm_type bm;

bm.left["one"] = 1; // "one" -> 1
bm.left["one"] = 2; // replaced: "one" -> 2
bm.right[2] = "two"; // Compile error

Как я могу избавиться от ошибки компиляции? Разве нельзя получить доступ к правому виду с помощью operator[]?


person B Faley    schedule 10.12.2012    source источник
comment
Что вы ожидаете от этого?   -  person David Schwartz    schedule 10.12.2012
comment
@DavidSchwartz Я пытаюсь использовать бимап как обычный std::map. Все мои ключи и значения уникальны. Мне нужно иметь возможность получать/устанавливать ключи по значениям и наоборот. (и я не был уверен в использовании list_of)   -  person B Faley    schedule 10.12.2012
comment
Но на карте есть только одно место, куда может попасть любой данный элемент. Я честно не понимаю, что вы ожидаете от этого. Не могли бы вы точно описать, что должен делать bm.right[2]? Например, если в списке нет 2, следует ли его добавить? Если да, то где?   -  person David Schwartz    schedule 10.12.2012
comment
@DavidSchwartz Я ожидаю, что bm.right[2] = "two" изменит одно отношение ‹-› 2 на это: два ‹-› 2 (или добавит это отношение, если оно еще не существует)   -  person B Faley    schedule 10.12.2012
comment
Верно, но добавить его где? В начале списка? Конец? Середина? Какое-то случайное место? Это просто не имеет смысла, если целые числа организованы в виде списка.   -  person David Schwartz    schedule 10.12.2012
comment
@DavidSchwartz Не имеет значения.   -  person B Faley    schedule 10.12.2012
comment
Тогда вам не следует использовать список! Вся цель списка состоит в том, чтобы сохранить произвольный порядок.   -  person David Schwartz    schedule 10.12.2012
comment
@DavidSchwartz Итак, bimap< set_of< std::string >, set_of< int > > поможет?   -  person B Faley    schedule 10.12.2012
comment
Да, так как есть только один способ добавить целое число к множеству целых чисел.   -  person David Schwartz    schedule 10.12.2012
comment
@DavidSchwartz Но когда я меняю list_of на set_of, я получаю ошибку компилятора для bm.left["one"] = 1.   -  person B Faley    schedule 10.12.2012
comment
Правильно, потому что записи в наборе неизменяемы. Вам нужно выбрать коллекцию, которая имеет именно ту семантику, которая вам действительно нужна.   -  person David Schwartz    schedule 10.12.2012
comment
@DavidSchwartz Не могли бы вы посоветовать коллекции, соответствующие моему требованию?   -  person B Faley    schedule 10.12.2012
comment
@DavidSchwartz У меня такая же проблема. Какая коллекция обеспечивает поведение, подобное хэш-карте?   -  person danijar    schedule 16.09.2014


Ответы (2)


list_of не имеет operator[].

Посмотрите на http://www.boost.org/doc/libs/1_47_0/libs/bimap/doc/html/boost_bimap/reference/list_of_reference.html

person ForEveR    schedule 10.12.2012

Этот код просто не имеет никакого смысла. В списках нет operator[], потому что вам нужно выбрать, куда вставить элемент, если он созданный. Поскольку списки не сортируются внутри (как карты), 2 может стоять в начале списка, в конце списка, в середине списка или в любом другом месте.

(Boost list_of имитирует семантику стандартного list.)

person David Schwartz    schedule 10.12.2012