温馨提示×

c++ set遍历 能修改元素吗

c++
小樊
84
2024-11-26 02:47:04
栏目: 编程语言

在C++中,使用std::set时,不能直接修改元素。std::set是一个关联容器,它包含一组唯一的对象,这些对象根据它们的键进行排序。当你遍历std::set时,实际上是在遍历它的副本,而不是原始集合。因此,在遍历过程中修改元素可能会导致未定义的行为。

如果你需要在遍历过程中修改元素,可以考虑以下几种方法:

  1. 使用迭代器遍历并删除元素,然后在适当的位置插入新元素。但是,这种方法可能会导致迭代器失效,因此需要谨慎操作。
#include <iostream>
#include <set>

int main() {
    std::set<int> my_set = {1, 2, 3, 4, 5};

    for (auto it = my_set.begin(); it != my_set.end(); ) {
        if (*it % 2 == 0) {
            it = my_set.erase(it);
        } else {
            ++it;
        }
    }

    for (const auto& elem : my_set) {
        std::cout << elem << " ";
    }

    return 0;
}
  1. 使用std::remove_if算法将不需要的元素移动到集合的末尾,然后使用std::set::erase方法删除这些元素。这种方法可以避免迭代器失效的问题。
#include <iostream>
#include <set>
#include <algorithm>

int main() {
    std::set<int> my_set = {1, 2, 3, 4, 5};

    my_set.erase(std::remove_if(my_set.begin(), my_set.end(), [](int n) { return n % 2 == 0; }), my_set.end());

    for (const auto& elem : my_set) {
        std::cout << elem << " ";
    }

    return 0;
}

请注意,这些方法可能会导致集合中的元素顺序发生变化。如果你需要保持元素的顺序,可以考虑使用其他容器,如std::liststd::vector

0