map и unordered_map, содержащие указатели на удвоение?

Если у меня есть std::map и std::unordered_map, как я могу использовать указатели на двойной, чтобы, когда unordered_map обновляет двойное значение для определенного ключа, это уже отражалось в std::map для того же "ключа "?

So:

unordered_map["1"] = 6 приводит к тому, что map["1"] также будет 6....


person user997112    schedule 03.10.2013    source источник
comment
Возможно, вы захотите принять решение, если одно из них было полезным.   -  person goji    schedule 05.10.2013


Ответы (2)


Нет причин, по которым вы не можете использовать указатели.

Пример:

#include <iostream>
#include <map>
#include <unordered_map>
#include <memory>

int main()
{
    std::unordered_map<std::string, std::shared_ptr<double>> umap;
    std::map<std::string, std::shared_ptr<double>> omap;

    std::shared_ptr<double> value(new double(1234.5));

    umap.emplace("key", value);
    omap.emplace("key", value);

    std::cout << "umap " << *umap["key"] << "\n";
    std::cout << "omap " << *omap["key"] << "\n";

    *umap["key"] = 9999.1;
    std::cout << "omap " << *omap["key"] << "\n";
}

Вывод:

umap 1234.5
omap 1234.5
omap 9999.1
person goji    schedule 03.10.2013

Может быть так:

std::unordered_map<std::string, double> um;
std::unordered_map<std::string, double*> om;

om["1"] = &um["1"];

Отныне *om["1"] всегда является значением соответствующего элемента в um. Просто убедитесь, что вы никогда не удаляете элементы из неупорядоченной карты.

(Источник: итератор и правила аннулирования ссылок)

person Kerrek SB    schedule 03.10.2013
comment
Даже перефразирование сделает недействительными итераторы и ссылки, не так ли? Не только стирание. - person goji; 04.10.2013
comment
@Troy: перефразирование делает недействительными итераторы, но не ссылки. (Потому что он не перемещает данные, но изменяет порядок итерации.) - person rici; 04.10.2013
comment
@rici Приятно знать ;) - person goji; 04.10.2013
comment
@Troy: 23.2.5p9 Перефразирование делает недействительными итераторы, изменяет порядок между элементами и изменяет, в каких сегментах появляются элементы, но не делает недействительными указатели или ссылки на элементы. - person rici; 04.10.2013