2013-06-25 46 views
-1

爲什麼我需要取消引用迭代器?例如在下面的程序爲什麼我需要取消引用迭代器?

#include <iostream> 
#include <string> 
#include <vector> 

int main() 
{ 
    using namespace std; 
    string s("some string"); 

    for(auto it = s.begin(); it != s.end(); && !isspace(*it); ++it) 
     *it = isupper(*it); 
    cout<<s; 
} 

爲什麼需要使用isupper(*it);而不只是isupper(it);

+0

請注意,您引用的代碼沒有意義,因爲您正在爲循環內的字符分配布爾值。你可能想用'toupper()'來代替。 –

+0

是的。在發佈問題後幾秒鐘,我意識到。哈哈! – Slay

+5

你指的是* dereferencing *,而不是引用。 –

回答

9

迭代器是一個通用指針。它東西。如果你有一個需要這個東西的函數(在這種情況下是char或int),而不是「指針」本身,你需要取消引用迭代器。

例如,標準advance函數將迭代器作爲其參數。因此,您通過迭代無解引用它,因爲在

std::advance(it, n); 

但是,如果你有一個指向一個int迭代器並且要通過4來增加該整數,你需要

(*it) += 4; 

我建議你應該閱讀a good book on C++

順便說一句,你的整個循環可以通過一個單一的調用來替代改造

std::transform(s.begin(), s.end(), s.begin(), toupper); 
+0

嘿,謝謝。我目前正在閱讀C++ primer第5版。它會好起來的。有什麼更好的,你可以推薦?我已經看過你發佈的帖子,但是我沒有足夠的經驗去挑選出好的帖子。 – Slay

+2

@Armen'toupper'是一個重載函數,你的'transform'例子不能保證工作。請參閱http://gcc.gnu.org/onlinedocs/libstdc++/manual/strings.html#strings.string.simple –

+0

@JonathanWakely我被告知,傳遞可能的負值到''是形式上未定義的行爲,應該總是將參數轉換爲'unsigned char'。 – jrok

4

你必須能夠在迭代器本身例如執行操作您的代碼確實it != s.end()++it

有時您需要能夠對迭代器指向的對象執行操作,例如, isupper(*it)

必須有一些操作指示要參考的東西它指的不是迭代器本身,否則,如果你測試if (it == another_it)如何將編譯器知道,如果你試圖比較迭代器或他們指向的東西?這同樣適用於++it操作,該操作要修改迭代器,而不是它指向的東西。

迭代器可以有一個get()成員返回他們指的是東西,所以你會做isupper(it.get())而是他們所支持的引用操作,這是打字少,與指針相一致,並允許指針的任何代碼中使用期望迭代器。

1

爲了區分指針T上的操作和主體T上的操作,必須有一個解引用操作符。

例如:

int* x = ...; 

x++; 

你的意思是你想增加指針,以便它指向內存中的下詮釋?還是你想增加x指向的int?

如果沒有委託運算符,這將是不明確的。

迭代器只是指針接口的泛化。

對比與參考:

int& x = ...; 

x++; 

引用具有替代性語義,並且不需要解引用。引用T的操作適用於主題T.缺點是不能修改引用本身。

相關問題