繁体   English   中英

使用 unordered_sets 的 unordered_map

[英]Using an unordered_map of unordered_sets

如果我有一个由字符串索引的 unordered_sets 的无序 map,例如

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

我有几个关于使用这种数据结构的问题。 无论如何,我是否可以在 map 中索引的集合中插入一个新值,而不必使用指向集合的指针或重新索引 map 值?

第二个问题,当我尝试索引 map 时,我遇到了一个未解决的外部符号错误。 举个例子,

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

}

我不确定为什么这会导致未解决的符号错误,因此那里的任何指导都会有所帮助。

提前致谢

编辑: UseMap[character] 的任何使用都会导致未解决的符号错误

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

全 Class

#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;
};

以及完整的错误信息:

Error 52 error LNK2001: unresolved external symbol "private: static class 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 boo st::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_tr aits@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

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

做这个:

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

现在set是对 map 中的值的引用。 (我不确定auto给了你什么,所以我把类型全写了;你也许可以使用auto逃脱。)你对set所做的任何更改都将反映在 map 中。

set.insert(used); // This updates the map, no need to write it back in.

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM