簡體   English   中英

std::vector::front() 和 begin() 的區別

[英]Difference between std::vector::front() and begin()

關於vector幫助說front()

返回對向量容器中第一個元素的引用。 與成員vector::begin不同,它返回指向同一元素的迭代器,而 this > 函數返回一個直接引用。

關於begin() vector 幫助說明

返回引用向量容器中第一個元素的迭代器。 請注意,與返回對第一個元素的引用的成員vector::front不同,> 此函數返回一個隨機訪問迭代器。

這段代碼輸出:

char arr[] = { 'A', 'B', 'C' };
vector<char> vec(arr, arr+sizeof(arr));
cout << "address of vec.front() " << (void*)&vec.front() << endl;
cout << "address of vec.begin() " << (void*)&vec.begin() << endl;

vec.front() 00401F90地址vec.front() 00401F90 vec.begin() 0030F494地址vec.begin() 0030F494

我不明白“直接引用”是什么意思? begin()的情況下不是一個random access iterator只是一個pointer

有人可以指出區別嗎?

根據The C++ Programming LanguageStroustrup第 16.3.3 節; front()視為第一個元素,將begin()視為指向第一個元素的指針。

在 begin() 的情況下,隨機訪問迭代器不只是一個指針嗎?

不,迭代器有一些指針語義,但它實際上是一個類。

即使是這樣,那也應該回答這個問題。 這就像問為什么指針的地址與其指向的對象的地址不同。

如果您取消引用迭代器,您將獲得相同的值,這將為您提供第一個元素:

&(*vec.begin())

因為

*vec.begin() == vec.front()

對於向量, begin()end()返回隨機訪問迭代器。 他們可能會返回一個普通的指針; 沒關系,因為它滿足成為隨機訪問迭代器的要求。 特別是,您可以編寫*begin()來獲取對序列中第一個對象的引用(假設有一個)。 front()為您提供對序列中第一個對象的引用,而無需通過中間迭代器。 像這樣:

vector<int> v;
v.push_back(3);
int i = *v.begin(); // i == 3
int j = v.front();  // j == 3

假設向量中至少有 1 個元素,

vec.front()

是相同的

*vec.begin()

為了保持清晰,請始終嘗試記住以下兩行,假設您有來自 STL 的向量v

v.front() = * v.begin()
&&
v.back() = * v.end()

這意味着如果你有一個向量:

v = {1,2,3,4};

並且您有一個名為 IT 的迭代器,您想訪問第一個和最后一個元素,您可以這樣做:

IT = v.begin();
std::cout<<*IT<<std::endl; // output : 1
IT = v.end();
std::cout<<*IT<<std::endl; // output : 4

或者你可以很容易地做到這一點:

std::cout<<v.front<<std::endl; // output  : 1
std::cout<<v.back<<std::endl; // output  : 4

兩者都將打印相同的輸出,區別僅在於是否要使用迭代器。

暫無
暫無

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

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