簡體   English   中英

解引用迭代器

[英]Dereferencing Iterator

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


int main()
{
    string s("some string");
    
    
      *s.begin() = toupper(*s.begin());
      
   
      std::cout << s << std::endl;
      
}

結果是:

一些字符串

為什么必須使用 *s.begin() ? 為什么我不能只使用 s.begin()? 喜歡:

s.begin() = toupper(s.begin());

為什么必須在迭代器前面使用解引用運算符 *?

在 C++ prime FIFTH EDITION P.107 一書中,它說我們取消引用該迭代器以將該字符傳遞給 toupper 並將大寫字母 S 返回到原始字符串。

但我還是不明白,為什么我們不能直接使用 s.begin() 。 指針不只是為了保存 memory 嗎?

假設您將使用指針:

 string s("some string");
 auto ptr = s.data();     // pointer to first character

然后你仍然需要取消引用它才能分配一個字符:

 *ptr = 'X';

指針增加了一層間接性。 指針不是它指向的東西。 您必須取消引用指針才能訪問指針對象。 關於迭代器是相同的。 字符串的迭代器不是字符,盡管您可以通過迭代器訪問字符。

如果您閱讀有關std::string的文檔,您可以看到begin()的原型,即iterator begin() ,它返回一個iterator

toupper()的原型是int toupper ( int c ); . 它返回一個int並接受一個int

在這里,您很想將一個 int (從toupper()返回)分配給一個迭代器(從s.begin()返回)。 你正在將一個迭代器傳遞給toupper() ,它接受一個int

s.begin() = toupper(s.begin()); // iterator = int(iterator)

如果您取消引用迭代器,它將返回它指向的值的引用。 ( char& )

*s.begin() = toupper(*s.begin()); // int = int(int)

請記住,您使用的是帶有迭代器的引用,而不是直接使用指針。

迭代器是一個指針,它有助於通過 object 進行循環。 在這種情況下 s.begin() 是一個指針,因此為了訪問它的值,您必須使用“*”取消引用它。

s.begin()返回一個指針,指向字符串中的第一個字符。 如果要為指針所指向的 memory 賦值,則需要取消引用 (*) 它。

暫無
暫無

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

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