[英]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.