2012-01-10 4 views
3
typedef struct 
{ 
    pthread_t threadId; 
    int  acceptSocketD; 
    char  *message; 
} threadData; 

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

使用:構造体をSTLマップに渡すには?

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**)’ 
+3

「typedef」を使って構造体に名前を付けるだけで、C++では役に立たないことになります。 – log0

+3

'char *'の代わりに 'std :: string'を使うことを検討してください。 'message'に動的にメモリを割り当てる場合、' threadData'のコピーコンストラクタ、代入演算子、およびデストラクタを書く必要があります。 – hmjd

+1

誰かがCとC++を混在させています... –

答えて

2

- 各エントリは、キーとマッピングされた値を有しています。 value_typeはコンテナ内の1つのエントリを表し、したがって両方を含みます。

あなたがそれを好む場合は、代わりにserverPortNumberThreadId[3490] = obj;と書くことができます。振る舞いが異なる場合があります(insertはすでにキーが存在する場合は何も行いませんが、このコードはそれを上書きしますが、あなたはすでにinsertの動作に依存している場合を除きます)。作成された/コピーされた/割り当てられたthreadDataオブジェクトの数によって、パフォーマンスが多少異なる場合があります。

+0

くそー!元気?私のダム。おそらく夢の中で、私は、 'x.insert(11、12);のようなマップの使い方を見ていました。 –

8

:マップに挿入する他の方法については

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

map::insert() reference pageを参照してください。

+0

これは1,2などの定数を超えて何かを渡すにはペアが必要だということですか? –

+1

@AnishaKaul No.マップの値はペアです。マップに要素を挿入するときは、リンク先ページの最初の挿入を使用する場合は、ペアを挿入する必要があります。 2番目または3番目のインサートを使用する場合、ペアは必要ありません。 –

+0

であり、そのリンクに要素を挿入する2つの方法が示されている。ペアの代わりに2つのものを挿入する必要がある場合、ペアが必要です。私の構造は1つのオブジェクトで、ペアが必要な理由は不明です。 –

0

pairは、key,valueではなく、挿入機能に送信する必要があります。

mapの場合に対である value_typeかかり insert他の容器と共通であるためあなたは、 insert関数のペアを必要
mymap.insert (pair<unsigned int,threadData>(3490, obj)); 
2
//always overwrites the old value 
serverPortNumberThreadId[3490]=obj; 
//only insert a new one 
serverPortNumberThreadId.insert(std::make_pair(3490, obj)); 
+0

VJovicの答えについての私の最後のコメントをご覧ください。 –

+0

@AnishaKaulあなたの答えはもっと詳細を取ります。すばらしいです。 – BruceAdi

+0

どういう意味ですか? –

関連する問題