2015-07-10 33 views
0
// Map created 
std::map<int, std::vector<int>> _map; 

// Key/Data inserted 
_map.insert(std::pair<int, std::vector<int> >(0, { i })); 

// Display values [ERROR] 
for (const auto &p : _map) 
{  
    std::cout << "m[" << p.first << "] = " << p.second << '\n'; 
} 

這是一個非常簡單的程序,用於創建地圖,插入值並通過遍歷整個地圖顯示兩個鍵/對。 我能夠顯示地圖鍵(p.first),但我無法顯示數據的值(p.second)。無法顯示地圖數據

錯誤C2679:二進制「< <」:沒有操作員發現它採用類型「常量性病::矢量>」(或沒有可接受的轉化率)

+3

你認爲p.second返回什麼?它返回一個整型向量,所以你需要編寫一個inner for循環來遍歷向量並在那裏打印整型。矢量不定義<<運算符。你也使用新的標準,所以,而不是臨時配對插入功能,你可以使用大括號initialisation._map.insert({0,{i}}) – ChajusSaib

+0

我無法訪問p.second值,那麼如何我能用它來創建嵌套循環嗎?你能舉個小例子嗎?謝謝 – Daqs

+0

你可以訪問它。 std :: cout沒有運算符<<,它可能會將vector作爲參數。像這樣添加一些內部循環:'for(auto&pp:p.second){std :: cout << pp; }' – Ari0nhh

回答

4

的右邊的操作數p.secondstd::vector<int>和標準庫不會超載operator<<vector s,如錯誤消息所述。所以你必須添加一個內部循環來通過vector並打印它包含的值。

而不是...

std::cout << "m[" << p.first << "] = " << p.second << '\n'; 

...嘗試...

std::cout << "m[" << p.first << "] = {"; 
for (int n : p.second) 
    std::cout << ' ' << n; 
std::cout << " }\n"; 
2

或者,您可以使用std::copy

std::copy(p.second.begin(), p.second.end(), std::ostream_iterator<int>(std::cout, " ")); 

對於打印p.second內容更一般的解決方案,我建議使用偉大的C++ container pretty print library。這個庫讓你的代碼工作沒有進一步的變化:

std::cout << p.second << std::endl; 
+0

我喜歡這是一條單行指令。讓我刪除關於這種方法的便利性的評論,以更加中立的方式呈現它。 –

0

你必須給自己定義爲operator >>std::vector

template <typename T> 
std::ostream & operator >>(std::ostream & out, const std::vector<T> & vec) { 
    std::copy(vec.begin(), vec.end(), std::ostream_iterator<T>(out, " ")); 
    return out; 
} 

您的代碼將工作是你加這個定義之後。

for (const auto & p : _map) {  
    std::cout << "m[" << p.first << "] = " << p.second << '\n'; 
}