2016-10-26 123 views
0

好吧,這是一個小問題,希望它有一個快速簡單的解決方案。C++:無法將索引分配給迭代器

在我的學校教科書,在一個關於STL一章,它提供了一個簡單的示例程序來輸入使用列表以及使用迭代器與列表,像這樣:

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

int main() 
{ 
    list<int> myIntList; 

    // Insert to the front of the list. 
    myIntList.push_front(4); 
    myIntList.push_front(3); 
    myIntList.push_front(2); 
    myIntList.push_front(1); 

    // Insert to the back of the list. 
    myIntList.push_back(5); 
    myIntList.push_back(7); 
    myIntList.push_back(8); 
    myIntList.push_back(9); 

    // Forgot to add 6 to the list, insert before 7. But first 
    // we must get an iterator that refers to the position 
    // we want to insert 6 at. So do a quick linear search  
    // of the list to find that position.  
    list<int>::iterator i = 0; 
    for(i = myIntList.begin(); i != myIntList.end(); ++i) 
     if(*i == 7) break;   

    // Insert 6 were 7 is (the iterator I refers to the position   
    // that 7 is located. This does not overwrite 7; rather it  
    // inserts 6 between 5 and 7. 
    myIntList.insert(i, 6); 

    // Print the list to the console window. 
    for(i = myIntList.begin(); i != myIntList.end(); ++i) 
     cout << *i << " "; cout << endl; 
} 

現在,在行說

list<int>::iterator i = 0; 

我得到VS 2015年的錯誤,說:

no suitable constructor exists to convert from"int" to "std::_List_iterator<std::_List_val<std::_List simple_types<int>>>" 

什麼爲t他提出的代碼存在問題,解決方案是什麼,爲什麼這是一個開始的問題? < - (我甚至會解決一個簡單的語法錯誤)。

+0

「在我的學校教科書」哇。 [考慮獲得更好的](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)。 –

+0

'std :: list'沒有隨機訪問迭代器,如'std :: vector' – ProXicT

+0

如果學校教科書有這樣一行:*** list :: iterator i = 0; ***我同意你需要一本更好的書.. – drescherjm

回答

2

什麼是代碼中的問題提出

在例如一個簡單的錯字。

如何解決

替換此行:

list<int>::iterator i = 0; 

有了這個來代替:

list<int>::iterator i; 

這是爲什麼開始有問題嗎?

您無法使用整數值初始化迭代器。只有容器知道它的迭代器引用了什麼,所以只有容器可以初始化它們。你所能做的就是從一個容器中請求一個迭代器,爲另一個迭代器分配一個迭代器,然後遞增/遞減/取消引用一個迭代器。就這些。

3

0可能不是迭代器的有效值。嘗試刪除作業或將迭代器分配到myIntList.begin()

迭代器可能無法被當作索引處理,如使用vector或數組。通常鏈接列表不被索引訪問;你必須從頭開始遍歷。

+1

然而,你是對的,你沒有解釋爲什麼'0'可能不是迭代器的有效值。如果我沒有弄錯,是不是因爲'std :: list'沒有隨機訪問迭代器而不像? '的std :: VECTOR'? – ProXicT

+0

據我所知,一個整數對於(任何)迭代器來說都不是一個有效的值,因爲要構造一個迭代器,需要以某種方式引用原始結構(從哪裏獲取迭代器)。這顯然不是一個簡單的整數情況。(或者當然沒有參數你創建了一個無效的空迭代器) – axalis

+1

可能沒有一個構造函數或賦值運算符需要一個整數值。 –

1

http://www.cplusplus.com/reference/iterator/

迭代器是任何對象,指向在一個範圍內的元素(例如,陣列或容器)的一些元件,具有穿過該範圍的元件進行迭代的能力使用一組運算符(至少使用增量(++)和解除引用(*)運算符)。

這意味着,一個迭代器應該能夠做到以下幾點:

  1. 返回它目前「指點」到(使用*運營商)
  2. 改變自己「點」對象其列表中的下一個對象(使用++運算符)

將迭代器作爲數據類型存在的原因是創建一種與不同類型的列表。但是,這意味着不同的列表將以不同的方式實現它們的迭代器。

在許多情況下,初始化一個迭代器到一個數字是沒有意義的,因爲在引擎下的實現。因此,我們沒有定義一個賦值運算符,其左側的迭代器類型爲std::vector<int>::iterator,右側爲int。所以當你試圖將你的迭代器賦值爲一個整數值時,你的編譯器會拋出一個錯誤。

讓我們來看一個例子,其中指定0的迭代器沒有意義。您可以將std::vector<int>的迭代器實現爲向量中元素的指針。在這種情況下:

  1. *解引用存儲在vector<int>::iterator指針並返回它的值。
  2. ++修改存儲在vector<int>::iterator中的指針,指向列表中的下一個元素。

然而,這種分配指針0將是相同,因爲它分配給NULL,並取消引用它不再返回的向量的有效元素。 (實際上,解引用NULL將導致錯誤!)

要避免此錯誤,只需確保始終將您的迭代器分配給相同類型的值。在STL中,這通常通過使用.begin()來返回指向列表中第一個元素的迭代器來完成。