Использование unordered_map из unordered_sets - PullRequest
1 голос
/ 04 мая 2011

Если у меня есть неупорядоченная карта unordered_sets, проиндексированная по строкам, например,

static boost::unordered_map<std::string, boost::unordered_set<std::string> > UseMap;

У меня возник вопрос по поводу использования этой структуры данных.Можно ли как-нибудь вставить новое значение в набор, проиндексированный на карте, без необходимости использовать указатель на набор или переиндексировать значение карты?

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

void AddUse(const std::string &character, const std::string& used)
{
    auto set = UseMap[character];
    set.insert(used);
    UseMap[character] = set;

}

Я не уверен, почему это вызывает неразрешенную ошибку символа, поэтому любые указания там будут полезны.

Заранее спасибо

РЕДАКТИРОВАТЬ: любое использование UseMap [символ] вызывает неразрешенную ошибку символа

Также добавлен код ошибки и пример источника

Полный класс

#pragma once
#ifndef _SINGLEUSE_H_
#define _SINGLEUSE_H_
#include <boost/unordered_map.hpp>
#include <boost/unordered_set.hpp>
#include <string>
#include <vector>
class SingleUse
{
public:
    void AddUse(const std::string& character, const std::string& used)
    {
        UseMap[character].insert(used);
    }

    bool HasUsed(const std::string &character, const std::string& used)
    {
        return false;//UseMap[character].find(used) != UseMap[character].end();
    }

    void ClearAll()
    {
        UseMap.clear();
    }
private:
    static boost::unordered_map<std::string, boost::unordered_set<std::string> > UseMap;
};

И полное сообщение об ошибке:

Ошибка 52: ошибка LNK2001: неразрешенный внешний символ "private: статический класс boost :: unordered_map, класс std :: allocator>, класс boost :: unordered_set, класс std :: allocator>, struct boost :: hash,класс std :: allocator>>, структура std :: equal_to, класс std :: allocator>>, класс std :: allocator, класс std :: allocator>>>, структура boost :: hash, класс std :: allocator>>, структура std :: equal_to, класс std :: allocator>>, класс std :: allocator, класс std :: allocator> const, класс boost :: unordered_set, класс std :: allocator>, структура boost :: hash, класс std:: allocator>>, struct std :: equal_to, класс std :: allocator>>, класс std :: allocator, класс std:: allocator>>>>>> SingleUse :: UseMap "(? UseMap @ SingleUse @@ 0V? $ unordered_map @ V? $ basic_string @ DU? $ char_traits @ D @ std @@ V? $ allocator @ D @ 2 @@станд @@ V? $ unordered_set @ V? $ basic_string @ DU? $ char_traits @ D @ станд @@ V? $ распределитель @ D @ 2 @@ станд @@ U? $ хэш @ V? $ basic_string @ DU? $ char_traits@ D @ станд @@ V? $ распределитель @ D @ 2 @@ станд @@@ увеличить @@ U? $ equal_to @ V? $ basic_string @ DU? $ char_traits @ D @ станд @@ V? $ распределитель @ D @2 @@ станд @@@ 2 @ V? $ распределитель @ V? $ basic_string @ DU? $ char_traits @ D @ станд @@ V? $ распределитель @ D @ 2 @@ станд @@@ 2 @@ @@ U увеличить? $ хэш @ V? $ basic_string @ DU? $ char_traits @ D @ станд @@ V? $ распределитель @ D @ 2 @@ станд @@@ 4 @ U? $ equal_to @ V? $ basic_string @ DU? $ char_traits @D @ станд @@ V? $ распределитель @ D @ 2 @@ станд @@@ 2 @ V? $ распределитель @ U? $ пара @ $$ ОЦК? $ basic_string @ DU? $ char_traits @ D @ станд @@ V?$ распределитель @ D @ 2 @@ станд @@ V? $ unordered_set @ V? $ basic_string @ DU? $ char_traits @ D @ станд @@ V? $ распределитель @ D @ 2 @@ станд @@ U? $ хэш @ V? $ basic_string @ DU? $ char_traits @ D @ станд @@ V? $ распределитель @ D @ 2 @@ станд @@@ увеличить @@ U? $ equal_to @ V? $ basic_string @ DU? $ char_traits @ D @ станд @@V? $ распределитель @ D @ 2 @@ станд @@@ 2 @ V & beta; $ распределитель @ V? $ basic_string @ DU? $ char_traits @ D @ станд @@ V? $ распределитель @ D @2 @@ std @@@ 2 @@ boost @@@ std @@@ 2 @@ boost @@ A) G: \ Documents \ Проекты программирования \ KHMP \ KHMP_Repo \ KHMP \ build \ KHMP \ KHMP \ KHMPMain.obj

Ответы [ 2 ]

3 голосов
/ 04 мая 2011

Первый вопрос, да, все должно быть хорошо, если вы назначите результат для ссылки.

Сделайте это:

boost::unordered_set<std::string>& set = UseMap[character];

Теперь set является ссылкой на значение на карте. (Я не уверен, что auto дает вам, поэтому я поставил тип полностью; вы можете избежать использования auto.) Любые изменения, внесенные вами в set, будут отражены на карте.

set.insert(used); // This updates the map, no need to write it back in.
1 голос
/ 04 мая 2011

Хорошо, неразрешенный символ - потому что я нигде не создаю экземпляр статической переменной.Я забыл, что ты должен был делать это в C ++, моя ошибка.Спасибо за помощь с наборами

...