Могу ли я иметь карту C ++, где несколько ключей ссылаются на значение без использования указателей? - PullRequest
3 голосов
/ 29 марта 2012

Из фона Си я снова попадаю в привычки Си, где обычно есть лучший способ. В этом случае я не могу придумать способ сделать это без указателей.

Я бы хотел

struct foo {
    int i;
    int j;
};

mymap['a'] = foo
mymap['b'] = bar

Пока только один ключ ссылается на значение, mymap.find будет возвращать ссылку, чтобы я мог изменить значение, но если я сделаю это:

mymap['c'] = mymap.find('a') // problematic because foo is copied right?

Цель состоит в том, чтобы найти «a» или «c» и изменить foo, а затем следующая находка «a» или «c» покажет обновленный результат.

Ответы [ 3 ]

3 голосов
/ 29 марта 2012

Нет, для этого вам понадобятся указатели.Каждая запись на карте содержит копию назначенного значения, что означает, что у вас не может быть двух ключей, относящихся к одному и тому же элементу.Теперь, если вы сохраняете указатели на элемент, тогда два ключа будут ссылаться на два отдельных указателя, которые будут ссылаться на один и тот же элемент в памяти.в каждом узле содержится std::pair<const Key,Value> объект (и дополнительная информация для древовидной структуры).При выполнении m[ key ] выполняется поиск узла, содержащего ключ, или создается новый узел в дереве, и возвращается ссылка на подобъект Value пары.

2 голосов
/ 29 марта 2012

Я бы использовал std::shared_ptr здесь. У вас есть пример совместного владения, и для этого создан shared_ptr. Хотя указатели, как правило, используются слишком часто, нет ничего плохого в их использовании при необходимости.

0 голосов
/ 29 марта 2012

Boost.Intrusive

Boost.Intrusive - это библиотека, представляющая некоторые навязчивые контейнеры миру C ++.Интрузивные контейнеры - это специальные контейнеры, которые обеспечивают лучшую производительность и исключительные гарантии безопасности, чем неинтрузивные контейнеры (например, контейнеры STL).

Преимущества интрузивных контейнеров в производительности делают их идеальными в качестве строительного блока для эффективного конструирования сложных контейнеров, таких как-индексные контейнеры или для разработки высокопроизводительного кода, такого как алгоритмы выделения памяти.

Хотя навязчивые контейнеры были и широко используются в C, они все больше и больше забываются в C ++ из-за наличия стандартных контейнеров, которые неt поддерживает навязчивые методы. Boost.Intrusive не только повторно вводит эту технику в C ++, но также инкапсулирует реализацию в STL-подобные интерфейсы.Следовательно, любой, кто знаком со стандартными контейнерами, может легко использовать Boost.Intrusive.

...