std::setやstd::multisetで末尾の要素を削除する


このエントリーをはてなブックマークに追加

std::setやstd::multisetで末尾の要素を削除するには、https://www.geeksforgeeks.org/how-to-delete-last-element-from-a-set-in-c/ で紹介されているテクニックを使います。例えばsをstd::setのオブジェクトとした場合、std::prev(s.end()) が末尾の要素を指すので、s.erase(std::prev(s.end())) とすれば末尾の要素を削除できます。例を以下に示します。wandboxで試すこともできます。

#include <iostream>
#include <set>

int main() {
    std::set<int> s{3, 2, 1, 5, 4};
    s.erase(std::prev(s.end()));

    // 1 2 3 4 と表示される
    for(auto e: s) std::cout << e << " ";
    std::cout << std::endl;

    std::multiset<int> ms{3, 2, 1, 5, 5, 4, 4};
    ms.erase(std::prev(ms.end()));

    // 1 2 3 4 4 5 と表示される
    for(auto e: ms) std::cout << e << " ";
    std::cout << std::endl;

    return 0;
}

setやmultisetの要素数がゼロの場合、上記コードは実行時にSegmentation faultを吐くので気をつけてください。