[英]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 Language中的Stroustrup第 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.