2014-01-24 129 views
-3

我目前正在嘗試爲列表編寫一個循環。我的代碼是:如何爲列表編寫for循環?

template<typename T> 
void Bubblesorting(list<T> & mylist) 
{ 
    typename T::const_iterator it1; 
    typename T::const_iterator it2; 
    for(it1=mylist.begin();it1!=mylist.end();it1++) 
     for(it2=mylist.begin();it2!=mylist.end()-(it1-begin());it2++) 
      if((*(std::next(it2,1))<*it2) 
       swap((*(std::next(it2,1)),*it2); 
     cout << *it2 << ' '; 
} 

編譯失敗:

error C2958: the left parenthesis '(' was not matched correctly 

能否請你幫我檢測究竟哪裏出了問題我怎麼能寫一個for循環列表的元素?

+1

列表迭代器不是隨機訪問,因此'+'運算符不起作用,並且您正在傳遞對const容器的引用,同時試圖在方法內對其進行變異。 – bobah

回答

6

函數體在它們周圍有{}。事實上,你還需要圍繞外部循環的主體。

您的迭代器類型也是錯誤的,因爲T是列表類型,而不是列表的元素類型。此外,它將需要是const_iterator,因爲您通過const參考的列表。

typename T::const_iterator it1; 

最後,既不(it2)+1也不mylist.end()-it1是可能的,因爲列表不適合隨機存取。你可以用std::advance和朋友來僞造它,但是由於遍歷一個列表並不重要(因爲數據結構的設計),所以這很困難。

總的來說,我會重溫這整個功能的概念。爲什麼不使用std::list::sort

我建議從these books挑選。

+2

我很慚愧地說我錯過了>> – Borgleader

+0

我認爲'{}'丟失是無意的 – P0W

+0

*「列表不支持隨機訪問。」*那麼爲什麼推薦'std :: sort'呢? :) – jrok

3

除了丟失{}你需要定義你的迭代器爲typename T::const_iterator it1;

+0

在這個功能的所有問題中,這是最不成問題的。 – Puppy

+0

這個問題指出編譯失敗,這就是爲什麼它不能編譯。 –

+1

這確實是四個報告錯誤中兩個的原因。 –

1

推測,你的真實代碼包含所有缺少的{},否則會有更多的錯誤。

T看起來是容器類型,而不是值類型,所以迭代器類型是typename T::iterator;除了容器是const,所以你只能得到一個const_iterator。但是你的代碼試圖修改容器,如果它是const,這是不可能的。也許你想將參數複製到一個新的容器中,並對其進行排序並返回;或者您可能想要使用非const引用並對容器進行排序(不返回任何內容)。

您試圖對不支持它們的迭代器類型執行隨機訪問操作。列表迭代器是雙向 - 你可以增加它們並遞減它們,但是你不能給它們增加任意數量,或者減去它們來給出一個距離。

也許使用像vector這樣的隨機存取容器更合適。或者,也許您可​​以用std::next(it,n)it2-it1替換it+nstd::distance(it1,it2)。 (或者,如果您遇到預C++ 11庫,請編寫您自己的這些函數版本。)

最後,it2!=mylist.end()-it1沒有意義;左邊是一個距離,不能與迭代器進行比較。也許你想end() - (it1-begin()),指的是遠離尾端的位置,因爲it1是從頭開始的。更有可能的是,你想從it1重複end()-1

+0

感謝您的明確指導,我剛剛開始編程,我的目的是實現列表對於i = 0,...,n - 2 對於j = 0,...,n - 我 - 2 如果aj +1 user3140486