如何将结构传递给STL地图?

时间:2012-01-10 09:57:00

标签: c++ stl map struct

typedef struct
{
    pthread_t threadId;
    int       acceptSocketD;
    char      *message;
} threadData;

map <unsigned int, threadData> serverPortNumberThreadId;
map <unsigned int, threadData> :: iterator serverPortNumberThreadIdIter;

用法:

threadData obj; 
obj.threadId      = 0;
obj.acceptSocketD = 0;
obj.message       = "Excuse Me, please!";

serverPortNumberThreadId.insert (3490, obj);

错误:

error: no matching function for call to ‘std::map<unsigned int, threadData>::insert(int, threadData&)’
/usr/include/c++/4.5/bits/stl_map.h:500:7: note: candidates are: std::pair<typename std::map<_Key, _Tp, _Compare, _Alloc>::_Rep_type::iterator, bool> std::map<_Key, _Tp, _Compare, _Alloc>::insert(const std::map<_Key, _Tp, _Compare, _Alloc>::value_type&) [with _Key = unsigned int, _Tp = threadData, _Compare = std::less<unsigned int>, _Alloc = std::allocator<std::pair<const unsigned int, threadData> >, typename std::map<_Key, _Tp, _Compare, _Alloc>::_Rep_type::iterator = std::_Rb_tree_iterator<std::pair<const unsigned int, threadData> >, std::map<_Key, _Tp, _Compare, _Alloc>::value_type = std::pair<const unsigned int, threadData>]
/usr/include/c++/4.5/bits/stl_map.h:540:7: note:                 std::map<_Key, _Tp, _Compare, _Alloc>::iterator std::map<_Key, _Tp, _Compare, _Alloc>::insert(std::map<_Key, _Tp, _Compare, _Alloc>::iterator, const std::map<_Key, _Tp, _Compare, _Alloc>::value_type&) [with _Key = unsigned int, _Tp = threadData, _Compare = std::less<unsigned int>, _Alloc = std::allocator<std::pair<const unsigned int, threadData> >, std::map<_Key, _Tp, _Compare, _Alloc>::iterator = std::_Rb_tree_iterator<std::pair<const unsigned int, threadData> >, std::map<_Key, _Tp, _Compare, _Alloc>::value_type = std::pair<const unsigned int, threadData>]
tcpClient.cpp: In function ‘int main(int, char**)’

4 个答案:

答案 0 :(得分:8)

您需要将值插入map:

serverPortNumberThreadId.insert ( std::make_pair( 3490, obj) );

有关插入地图的其他方式,请参阅map::insert() reference page

答案 1 :(得分:2)

 //always overwrites the old value
 serverPortNumberThreadId[3490]=obj;
 //only insert a new one
 serverPortNumberThreadId.insert(std::make_pair(3490, obj));

答案 2 :(得分:2)

您需要一对insert函数,因为与其他容器insert一样,value_type采用mapvalue_type是一对 - 每个条目都有一个键和一个映射值。 serverPortNumberThreadId[3490] = obj;表示容器中的一个条目,因此包括两者。

如果你喜欢它的外观,你可以写insert。行为有时是不同的(如果密钥已经存在,insert什么也不做,而这段代码会覆盖它,但除非你依赖threadData的行为,否则这对你没有任何影响)。就创建/复制/分配的{{1}}个对象的数量而言,性能可能略有不同。

答案 3 :(得分:0)

您必须发送pair插入功能,而不是key,value

mymap.insert ( pair<unsigned int,threadData>(3490, obj) );