Как передать структуру на карту STL? - PullRequest
4 голосов
/ 10 января 2012
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 ]

8 голосов
/ 10 января 2012

Вам необходимо вставить значение в карту:

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

Другие способы вставки в карту см. На справочной странице map :: insert () .

2 голосов
/ 10 января 2012

Вам нужна пара для функции insert, потому что совместно с другими контейнерами insert принимает value_type, что в случае map является парой - каждая запись имеет ключ и сопоставленноезначение.value_type представляет одну запись в контейнере и, следовательно, включает в себя оба.

Вместо этого можно написать serverPortNumberThreadId[3490] = obj;, если вы предпочитаете его вид.Поведение иногда отличается (insert ничего не делает, если ключ уже существует, тогда как этот код перезаписывает его, но если вы уже не полагаетесь на такое поведение insert, для вас это не имеет значения).Производительность может немного отличаться с точки зрения количества threadData объектов, созданных / скопированных / назначенных.

2 голосов
/ 10 января 2012
 //always overwrites the old value
 serverPortNumberThreadId[3490]=obj;
 //only insert a new one
 serverPortNumberThreadId.insert(std::make_pair(3490, obj));
0 голосов
/ 10 января 2012

Вы должны отправить pair для вставки функции, а не key,value.

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