2014-06-05 44 views
0
map<int, set<int> > map_set; 
srand(time(0)); 
for (int i = 0; i < rand()%50 + 20; ++i) { 
    int k = rand()%10, v = rand()%10; 
    pair<map<int, set<int> >::iterator, bool> ret = map_set[k].insert(v); 
    if (!ret.second) 
     cout << "Attempted to insert [" << k << ":" << v << "], but entry already existed [" << ret.first->first << ":" << ret.first->second << "]" << endl; 
} 

我收到以下錯誤在我定義ret行:錯誤試圖存儲時地圖的返回值插入

[Error] conversion from 'std::pair<std::_Rb_tree_const_iterator<int>, bool>' to non-scalar type 'std::pair<std::_Rb_tree_iterator<std::pair<const int, std::set<int> > >, bool>' requested 

它看起來像編譯器告訴我,我沒有宣佈ret作爲pair<map<int, set<int> >::iterator, bool>,但作爲一些其他的事情,我不明白。

我不知道什麼是錯的,因爲在這種不同的方式做同樣的事情的作品:

for (int i = 0; i < rand()%50 + 20; ++i) 
    if (!(map_set[rand()%10].insert(rand()%10)).second) 
     cout << "Failed attempt to insert value for a new key: it already existed" << endl; 
+1

'ret'的類型是插入到'地圖>'。但'map_set [k] .insert(v)'插入到'set '中。 – tenfour

+0

這個問題似乎是脫離主題,因爲這不是一個幫助臺。 –

回答

3

insert的呼叫是指std::set因此返回類型應該是:

std::pair<std::set<int>::iterator, bool> ret = map_set[k].insert(v); 

Live demo

如果你可以使用C++ 11,你應該看看auto,那將會簡化呼叫:

auto ret = map_set[k].insert(v); 
+1

謝謝你,我怎麼可能沒有注意到!我也很喜歡人們如此愉快地降低喜好 – dabadaba

+0

我沒有低調,但這個問題不可能在將來幫助任何人。基本的語法問題對於除了你之外的任何人都沒有什麼幫助,所以可能會導致被低估或關閉。只要你得到你的答案,不傷害沒有犯規:) – tenfour