2

如果我有一个由字符串索引的 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[character] 的任何使用都会导致未解决的符号错误

还添加了错误代码和源示例

全班

#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:未解析的外部符号“私有:静态类 boost::unordered_map,class std::allocator >,class boost::unordered_set,class std::allocator >,struct boost::hash,class std::allocator > >,struct std::equal_to,class std::allocator > >,class std::allocator,class std::allocator > > >,struct boost::hash,class std::allocator > >,struct std::equal_to ,class std::allocator > >,class std::allocator,class std::allocator > const ,class boost::unordered_set,class std::allocator >,struct boost::hash,class std::allocator > >, struct std::equal_to,class std::allocator > >,class std::allocator,class std::allocator > > > > > SingleUse::UseMap"(?UseMap@SingleUse@@0V?$unordered_map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$unordered_set@V?$basic_string@ DU?$char_traits@D@std@@V?$allocator@D@2@@std@@U?$hash@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@ 2@@std@@@boost@@U?$equal_to@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator @V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@boost@@U?$hash@V?$basic_string@DU?$char_traits @D@std@@V?$allocator@D@2@@std@@@4@U?$equal_to@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2 @@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V? $unordered_set@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@U?$hash@V?$basic_string@DU?$char_traits@D@std@ @V?$allocator@D@2@@std@@@boost@@U?$equal_to@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std @@@2@@boost@@@std@@@2@@boost@@A) G:\Documents\Programming Projects\KHMP\KHMP_Repo\KHMP\build\KHMP\KHMP\KHMPMain.obj

4

2 回答 2

4

第一个问题,是的,只要将结果分配给参考就可以了。

做这个:

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.
于 2011-05-04T07:31:45.063 回答
1

好的,未解析的符号是因为我没有在任何地方实例化静态变量。我忘了你必须在 C++ 中这样做,我的错误。感谢您对套装的帮助

于 2011-05-04T08:59:20.247 回答