2012-09-10 106 views
2

我試圖從多向量集合中打印出每個向量中的所有元素。構建失敗,但錯誤發生在頭文件的某處,恐怕我根本不瞭解錯誤代碼。任何幫助將不勝感激!這是錯誤:C++:遍歷多個向量的集合

error: invalid conversion from 'const std::basic_string<char, std::char_traits<char>, std::allocator<char> >* const' to 'std::basic_string<char, std::char_traits<char>, std::allocator<char> >*' 

而這裏是導致問題的代碼。

multiset<vector <string> > setOfRules; 
vector<string> testing,testing2; 

testing.push_back("bar"); 
testing.push_back("foo"); 
testing2.push_back("foo2"); 
testing2.push_back("bar2"); 
setOfRules.insert(testing); 
setOfRules.insert(testing2); 

for (multiset< vector <string > >::iterator myIterator = setOfRules.begin(); 
    myIterator!=setOfRules.end(); 
    ++myIterator) 
{ 

    for (vector<string>::iterator myOtherIterator = (*myIterator).begin(); 
     myOtherIterator != (*myIterator).end(); 
     ++myOtherIterator) 
    { 
     cout << *myOtherIterator << " " ; 
    } 
    cout << endl; 
} 
+0

我沒有看到你加入'testing'和'testing2'到'setOfRules'。 –

+0

同意。此代碼中的'setOfRules'爲空。 – japreiss

+0

迭代'multiset'需要你使用'const_iterator'。否則,您可能會嘗試在迭代過程中更改該集合的「鍵」,這會破壞集合中的排序。 –

回答

4

C++ 11標準聲稱關聯容器,其中值類型是相同的密鑰類型,既迭代和常量性是恆定迭代

所以實際multiset<vector<string>>::iteratorconst_iterator。與std::set迭代器相同的技巧 - 它們都是常量。

這意味着,因爲你試圖從常量對象(通過*myIterator這是const給出)獲得非const迭代vector<string>::iterator myOtherIterator = *myIterator.begin()語句將失敗。

要解決,你需要使用vector<string>::const_iterator

for(multiset<vector<string>>::const_iterator myIterator = setOfRules.begin(); 
    myIterator != setOfRules.end(); ++myIterator) 
{ 
    for(vector<string>::const_iterator myOtherIterator = *myIterator.begin();  
     myOtherIterator != *myIterator.end(); ++myOtherIterator) 
    { 
     cout << *myOtherIterator << " "; 
    } 
    cout << endl; 
} 
+0

因爲我的聲譽不夠高,但不僅僅因爲解決問題而且非常感謝解釋原因! – user1611598

1

我的猜測,而這只是一個猜測,因爲你不顯示所有必要的代碼就知道了,是你使用了錯誤的迭代器類型。它看起來基於編譯器嘔吐,你需要使用const_iterator,因爲你的對象是不變的。

您不能分配給關聯容器的關鍵部分(如multiset)。這意味着你的向量是const。你需要const迭代器來迭代它。

multiset似乎是非常量。你不需要一個const迭代器來導航它。它包含的值類型的常量性質將防止分配給密鑰。

+0

這是程序中存在的所有代碼,除了#​​include的等,但謝謝你的嘗試。 – user1611598

+0

哦,我認爲這是一個片段。問題在於,你不能在函數之外做這樣的執行語句。您可以執行可以調用函數或執行單個語句的分配,但不能在函數之外包含大部分語句。 –

1

有一個普通的multiset<XXX>::iterator myIterator是錯誤的,因爲如果你做一個 *myIterator = ...;那麼你會破壞multiset。

使用const_iterator代替

for (multiset< vector <string > >::const_iterator myIterator = setOfRules.begin(); myIterator!=setOfRules.end(); ++myIterator) { 
+0

我想你會發現你在錯誤的地方應用這個。這是另一個循環的迭代器,需要是const。這樣做不會傷害任何東西,但也不會解決問題。 –