Boost: Достъп до bimap чрез operator[]

В следния код:

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 Опитвам се да използвам bimap като нормален 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 Имам същия проблем. Коя колекция осигурява поведение, подобно на hashmap?   -  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 може да отиде в началото на списъка, в края на списъка, в средата на списъка или където и да е другаде.

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

person David Schwartz    schedule 10.12.2012