[英]C++ iterator to last element of a set
我在 C++ 中有以下代碼
#include <iostream>
#include <set>
using namespace std;
int main()
{
set<int> a;
int n;
for(int i=0;i<3;i++){
cin>>n;
a.insert(n);
}
cout << *a.end();
return 0;
}
為什么它總是打印“3”而不是集合中的最大元素? 替換cout << *a.end();
與cout << *--a.end();
工作正常。
只需使用*a.rbegin()
指向集合中的最后一個元素
*a.end()
未定義的行為。 在 C++ 迭代器術語中,“結束”與“最后一個元素”的含義不同。
替換
cout << *a.end();
與cout << *--a.end();
工作正常。
考慮一個反向迭代器: *a.rbegin()
。
請記住,如果容器不為空,則begin()
和rbegin()
僅返回可取消引用的迭代器。 對於空容器, begin() == end()
和rbegin() == rend()
。
為什么總是打印“3”而不是集合中最大的元素?
因為a.end()
是向量末尾之后的一個。 它不包含任何有效數據,它是向量結束的標記。 如:
for(auto i = a.begin(); i != a.end(); ++i)
// do stuff with i
編輯:(感謝內森)取消引用a.end()
產生可怕的未定義行為。 任何事情都可能發生:得到3
,得到集合中的最后一個元素,甚至可以取消聖誕節!!!
要找到集合的最后一個元素,我們可以做的是使用一個指向集合最后一個元素的迭代器,然后遞減迭代器以到達最后一個元素,因為 set.end() 表示指向末尾的迭代器套。
auto it = s.end();
it--;
cout<<(*it)<<endl;
對於set<int>s
您也可以使用*prev(s.end())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.