unordered_map插入错误C ++

时间:2011-05-17 18:40:09

标签: c++ set unordered-map

我试图插入一个带有std :: set值的unordered_map:

class Database {
...
private:
    struct CountryRCID {
        int RCID;
        int Vote;
    };
    struct comp {
        bool operator() (const CountryRCID& left, const CountryRCID& right) const {
            return left.RCID < right.RCID;
        }
    };
    std::unordered_map<const char*, std::set<CountryRCID, comp> > CNTVotes;
};

在数据库构造函数中,我正在从文件中读取数据并尝试插入到unordered_map中

Database() {
    char CNT[3];
    CountryRCID RCIDVote;
    ... Insert data into CNT and RCIDVote ...
    CNTVotes.insert(std::make_pair(CNT, RCIDVote));
}

我尝试用以下两种方法编译代码:

g++ main.cpp -std=gnu++0x

g++ main.cpp -std=c++0x

但是我收到了错误:

In file included from /usr/include/c++/4.4/bits/stl_algobase.h:66,
                 from /usr/include/c++/4.4/bits/char_traits.h:41,
                 from /usr/include/c++/4.4/ios:41,
                 from /usr/include/c++/4.4/istream:40,
                 from /usr/include/c++/4.4/fstream:40,
                 from db.h:1,
                 from main.cpp:1:
/usr/include/c++/4.4/bits/stl_pair.h: In constructor ‘std::pair<_T1, _T2>::pair(std::pair<_U1, _U2>&&) [with _U1 = char*, _U2 = Database::CountryRCID, _T1 = const char* const, _T2 = std::set<Database::CountryRCID, Database::comp, std::allocator<Database::CountryRCID> >]’:
db.h:50:   instantiated from here
/usr/include/c++/4.4/bits/stl_pair.h:107: error: no matching function for call to ‘std::set<Database::CountryRCID, Database::comp, std::allocator<Database::CountryRCID> >::set(Database::CountryRCID)’
/usr/include/c++/4.4/bits/stl_set.h:212: note: candidates are: std::set<_Key, _Compare, _Alloc>::set(std::initializer_list<_CharT>, const _Compare&, const _Alloc&) [with _Key = Database::CountryRCID, _Compare = Database::comp, _Alloc = std::allocator<Database::CountryRCID>]
/usr/include/c++/4.4/bits/stl_set.h:199: note:                 std::set<_Key, _Compare, _Alloc>::set(std::set<_Key, _Compare, _Alloc>&&) [with _Key = Database::CountryRCID, _Compare = Database::comp, _Alloc = std::allocator<Database::CountryRCID>]
/usr/include/c++/4.4/bits/stl_set.h:188: note:                 std::set<_Key, _Compare, _Alloc>::set(const std::set<_Key, _Compare, _Alloc>&) [with _Key = Database::CountryRCID, _Compare = Database::comp, _Alloc = std::allocator<Database::CountryRCID>]
/usr/include/c++/4.4/bits/stl_set.h:145: note:                 std::set<_Key, _Compare, _Alloc>::set(const _Compare&, const _Alloc&) [with _Key = Database::CountryRCID, _Compare = Database::comp, _Alloc = std::allocator<Database::CountryRCID>]
/usr/include/c++/4.4/bits/stl_set.h:136: note:                 std::set<_Key, _Compare, _Alloc>::set() [with _Key = Database::CountryRCID, _Compare = Database::comp, _Alloc = std::allocator<Database::CountryRCID>]

我也尝试了不同的插入方法:

CNTVotes[CNT] = RCIDVote;

std::pair <const char*, CountryRCID> test (CNT, RCIDVote);
CNTVotes.insert(test);

只会导致类似的错误

如果有人能帮助我理解为什么它不起作用以及我能做些什么来使这项工作,我将非常感激。

谢谢。

4 个答案:

答案 0 :(得分:4)

可能没有直接与你的问题有关,但char *的地图从未真正起作用。而不是:

 std::unordered_map<const char*, std::set<CountryRCID, comp> > CNTVotes;
你可能想要:

 std::unordered_map<std::string, std::set<CountryRCID, comp> > CNTVotes;

答案 1 :(得分:2)

CountryRCIDstruct类型,它不是std::set ...您首先需要构建std::set类型std::set<CountryRCID>并使用在makePair()的参数中,以匹配unordered_map的模板参数。

我还认为struct comp仿函数是多余的......只需为operator<()结构定义operator==()CountryRCID

如果您这样做,并将CNTVotes的声明更改为(BTW,请注意我借用Neil的建议,使用std::string而不是const char*作为键值......我认为这是一个非常好的主意)

std::unordered_map<std::string, std::set<CountryRCID> > CNTVotes;

然后您可以执行以下操作:

CountryRCID RCIDVote;
//... Insert data into CNT and RCIDVote ...
std::string CNTString(CNT);
std::set<CountryRCID> RCIDVoteSet;  // <== make a std::set of type set<CountryRCID>
RCIDVoteSet.insert(RCIDVote);
CNTVotes.insert(std::make_pair(CNTString, RCIDVoteSet));

答案 2 :(得分:1)

没有构造函数可以从进入该集合的类型的单个对象创建集合。您需要创建一个临时集并将该项添加到该集,然后使用该集添加到unordered_map

编辑:实际上,因为你有一个实际的对象,我认为你可以像这样使用iterator, iterator构造函数:

CNTVotes.insert(std::make_pair(CNT, std::set(&RCIDVote, &RCIDVote + 1)));

答案 3 :(得分:0)

正如Jason所说,你在地图中的价值是一个集合,而不是一个CountryRCID结构。如果您要将CountryRCID添加到地图中的集合,则可能需要以下内容:

typedef std::set<CountryRCID, comp> MySet;
typedef std::unordered_map<const char*, MySet> MyMap;

MyMap::_Pairib ret = CNTVotes.insert(std::make_pair(CNT, MySet()));
ret.first->second.insert(RCIDVote);