2013-03-04 105 views
5

我想學習一點Java背景的C++,並試圖編寫返回兩個列表交集的代碼。我相信我在概念上有正確的想法,但由於沒有任何內容正在編譯,因此遇到了語法問題。Beginner C++:將索引語法轉換爲迭代器語法

下面的代碼我想出了:

#include <iostream> 
using namespace std; 
#include <list> 

template <typename Object> 
list<Object> intersection(const list<Object> & L1, const list<Object> & L2){ 

    std::list<Object> result;     
    int pos1 = 0; 
    int pos2 = 0; 

    while (pos1 < L1.size() && pos2 < L2.size()) { 
    if (L1[pos1] > L1[pos2]) { 
     pos1++; 
    } else if (L2[pos2] > L1[pos1]) { 
     pos2++; 
    } else { 
     result.push_back(L2[pos2]); 
     pos1++; 
     pos2++; 
    } 
    } 
    return result; 

} 

事情我想我需要: 一個iterator(我敢肯定,我在訪問列表的方式是不正確的)

+1

我修改了標題以使其具有更好的描述性,並指出這是一個相對普遍的問題,對於未來的用戶很有意思。我希望這是好的(如果不是,請回復)。 – jogojapan 2013-03-04 08:16:51

+1

既然你是C++的初學者,可能值得一提的是你不應該真的使用'std :: list' ......永遠。 (不是因爲C++類有什麼問題,而是因爲它是一個可怕的數據結構)。當你只需要一個容器時,默認爲'vector '而不是。 (這也可以讓你的代碼使用索引而不是迭代器) – jalf 2013-03-04 08:21:02

+0

好點。 'vector'在大多數情況下都更好,但我認爲知道'list'和'vectors'的優點和缺點是很好的,如果你想在某些時候編寫好的C++代碼,你需要知道指針/迭代器。 – Ari 2013-03-04 08:29:37

回答

4

變化POS1和POS2到迭代器:

list<Object> intersection(const list<Object> & L1, const list<Object> & L2){ 
    std::list<Object> result;     
    std::list<Object>::iterator pos1 = L1.begin(), pos2 = L2.begin(); 
    while (pos1 != L1.end() && pos2 != L2.end()) { 
    if (*pos1 > *pos2) { //works only if pos1 != L1.end() and pos2 != L2.end() 
     pos1++; 
     ... 

pos1 = L1.begin()pos1到的L1第一個元素。

++pos1移動迭代器向前,到下一個元素

*pos1pos1

pos1 != L1.end()檢查得到的元素,則將pos1到達列表結束。當pos1 == L1.end()時,您不能從pos1獲取元素。

+0

非常感謝你,這正是我所需要的。 – 2013-03-04 08:03:35

+1

迭代器需要是'const'。 – 2013-03-04 09:16:39

2

您需要一個const_iterator而不是iterator

所有C++容器類have typedefs on them都定義了它們包含的類型,迭代器類型以及其他內容。

在你的情況下,list<Object>::value_typeObject類型。所以,你可以說:

list<Object>::value_type object = Object(); 

同樣list<Object>::iterator是用於遍歷容器的迭代器的類型。您可以使用begin()end()來獲取代表容器開始和結束的迭代器。

如果您的容器爲const與您的問題begin和結束不返回iterator他們返回const_iterator。您不能將此分配給iterator類型。它們是不同的,因爲一個允許你修改該值,另一個不允許。

您可以通過使用const_iterator來解決您的問題。但是,還有其他一些解決方法。

  • auto表示您不必明確說明類型。它爲你做了正確的事情。
  • 模板可以使用泛型參數,因此,您不必顯式。
  • 標準庫有各種算法可能已經做到了你想要的(例如set_intersection)。