简体   繁体   English

unordered_map插入错误C ++

[英]unordered_map insert error C++

I am trying to insert into an unordered_map with a std::set value declared as such: 我正在尝试将具有这样声明的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;
};

In the Database constructor I am reading data in from a file and attempting to insert into the unordered_map 在数据库构造函数中,我正在从文件中读取数据,并尝试插入unordered_map中

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

And I have attempted compiling the code with both: 而且我尝试用以下两种方法编译代码:

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

and

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

But am receiving the error: 但是正在收到错误:

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>]

I have also tried different insert methods: 我也尝试了不同的插入方法:

CNTVotes[CNT] = RCIDVote;

and

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

which just results in similar errors 只会导致类似的错误

I would very much appreciate it if anyone could help me understand why it is not working and what I could do to make this work. 如果有人能帮助我了解它为什么不起作用以及我可以做些什么来使它起作用,我将非常感激。

Thank you. 谢谢。

Possibly nothing directly to do with your problem, but maps of char * never really work. 可能与您的问题没有直接关系,但是char *的映射永远无法真正起作用。 Instead of : 代替 :

 std::unordered_map<const char*, std::set<CountryRCID, comp> > CNTVotes;

you probably want: 您可能想要:

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

CountryRCID is a type struct , it is not a std::set ... you would first need to construct a std::set of type std::set<CountryRCID> and use that in your arguments to makePair() in order to match the template arguments for your unordered_map . CountryRCID是一种struct ,它不是一个std::set ...你首先需要构建一个std::set类型std::set<CountryRCID>和使用,在您的参数makePair()以与您的unordered_map的模板参数匹配。

I also think the struct comp functor is redundant ... just define operator<() and operator==() for your CountryRCID struct. 我还认为struct comp函子是多余的...只需为CountryRCID结构定义operator<()operator==()

If you do that, and change the declaration of CNTVotes to (BTW, note that I'm borrowing Neil's suggestion to use std::string rather than a const char* as the key-value ... I think that's a very good idea) 如果这样做,然后将CNTVotes的声明CNTVotes为(BTW,请注意,我借用了Neil的建议,使用std::string而不是const char*作为键值...我认为这是一个很好的主意)

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

then you can do the following: 那么您可以执行以下操作:

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));

There is no constructor to make a set from a single object of the type that goes into that set. 没有构造函数可以根据进入该集合的类型的单个对象来建立集合。 You'll need to create a temporary set and add the item to it, then use that to add to the unordered_map . 您需要创建一个临时集并将其添加到其中,然后使用它添加到unordered_map

EDIT: Actually since you have an actual object I think you can get away with the iterator, iterator constructor like this: 编辑:实际上,由于您有一个实际的对象,我认为您可以摆脱iterator, iterator像这样的iterator, iterator构造函数:

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

As Jason mentioned, your value in the map is a set rather than a single CountryRCID struct. 如Jason所述,您在地图中的值是一个集合,而不是一个CountryRCID结构。 If you mean to add the CountryRCID to the set in the map you probably want something like: 如果您打算将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);

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

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