簡體   English   中英

STL中的迭代器指針如何工作

[英]How Iterator pointers in the STL work

嘿,我對迭代器的工作方式有些困惑。 在這種情況下,特別是類的const_iterator 我知道它們實際上只是指向字符串的特定元素或您正在使用的任何內容的指針,但是在那種情況下: 我會認為它們是一個內存地址,因此,您不能僅僅添加整數來獲取字符串中的下一項。

這是我很困惑的代碼:

string::const_iterator iCharacterLocater;

for ( iCharacterLocater = strSTLString.Begin();
      iCharacterLocater != strSTLString.end();
      ++ iCharacterLocater )
{
    cout << "Character [ " << nCharOffset ++ <<"] is: ";
    cout << *iCharacterLocater << endl;
}

謝謝!! =)

比這復雜一點。 迭代器指的是同名GOF設計模式 ,在C ++中,迭代器的使用方式類似於指針。 C ++使您可以重載運算符,這意味着當在其上使用某些運算符時,自定義類型可以以特定方式運行。

C ++中幾種類型的迭代器 ,具有不同的功能級別。 向量和字符串的基本表示都非常簡單,以至於迭代器的行為幾乎完全類似於指針:您可以向其添加數字以查找特定的項。 例如, myVector.begin() + 5將迭代器返回到向量的第6個元素(第6個因為索引是從零開始的,而0是第一個)。 字符串迭代器還允許您執行此操作。

字符串常量迭代器的行為非常類似於常量char指針。 當您看到const char* foo ,並不表示您不能更改foo僅表示您不能更改其指向的內容。 因此,當您看到std::string::const_iterator foo ,這並不意味着您不能更改foo 這只是意味着您無法更改其引用的內容。

const char* foo = "abcd";
foo = "zyxwvu"; // valid: the pointer itself can be changed
*foo = 't'; // invalid: the pointed data can't be changed
*(foo + 2) == 'x'; // true

std::string myString = "zyxwvu";
std::string::const_iterator foo = myString.begin();
foo = myString.begin() + 2; // valid: the iterator itself can be changed
*foo = 't'; // invalid: the pointed data can't be changed
*(foo + 2) == 'x'; // true

如果您不嘗試修改數據,則迭代器和const迭代器的行為相同。 此外,除了兩者之間沒有直接轉換外,指向字符串內容的指針和指向字符串內容的迭代器的行為完全相同。

它們是一個內存地址。 關於這些STL容器的問題是,當您將10個元素存儲在一個中時,僅出於這個原因,這些元素都是相鄰的。 這樣,當您使用itr ++時,它指向下一個內存地址,該地址肯定是下一個元素。

因此,std :: string只是位於字符數組的頂部。 這些字符在內存中並排放置。 如果您指向一個字符,並增加指針,則現在指向下一個指針。 std :: string :: begin()返回指向第一個字符的指針,std :: string :: end()返回指向最后一個字符之后的位置的指針。

const std :: string :: iterator表示您無法修改迭代器。 因此,您無法增加它或使其指向其他對象。

std :: string :: const_iterator表示您無法修改迭代器指向的值。 因此,您可以更改迭代器指向的值(itr ++),但不能更改該內存地址的實際值。

迭代器基本上是一個指針,正確! 但是真正重要的是它的指向。

我認為,迭代器是指向定義為type的結構的指針。 例如,

  • 對於字符串類型的向量,迭代器將是指向字符串結構的指針(字符串是系統定義的結構)
  • 對於classA類型的vector,迭代器將是指向classA結構的指針(基本上,class是用戶定義的結構)

以這種方式定義迭代器的好處在於,我們可以以結構形式定義所有內容,因此我們可以通過為其定義迭代器來檢索所有內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM