簡體   English   中英

C++ 迭代器到集合的最后一個元素

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

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