矢量擦除范围内的元素

时间:2017-07-04 17:15:57

标签: c++ vector

为什么程序停止了?该程序编译,但如果我运行,他打破,并给出一些关于迭代器向量不能递增的消息。 有什么问题?

int main() 
{
    std::vector<int> vec;
    for (int i = 1; i <= 100; ++i)
        vec.push_back(i);
    for (auto itr = vec.begin() + 5; itr < vec.end() - 5; ++itr)
        vec.erase(itr);
    for (const auto& itr : vec)
            std::cout << itr << std::endl;
    return 0;
}

2 个答案:

答案 0 :(得分:4)

你错了,因为函数擦除不是无效的迭代器。 所以你可以这样做:

auto itr = vec.begin() + 5;
while (itr != vec.end() - 5) {
itr = vec.erase(itr);
}

或更灵活(没有循环)

vec.erase(vec.begin() + 5, vec.end() - 5);

答案 1 :(得分:2)

如果要使用for循环擦除向量中的元素,可以通过向后迭代元素集来实现。例如

#include <vector>
#include <iostream>
int main()
{
    std::vector<int> vec;
    for (int i = 0; i <= 100; ++i)
        vec.push_back(i);
    for (auto itr = vec.end() - 6; itr > vec.begin() + 4; --itr)
        vec.erase(itr);
    for (const auto& itr : vec)
        std::cout << itr << std::endl;
    return 0;
}

正如21koizyd所指出的,如果要删除一系列元素,可以使用std::vector::erase的第二个参数来指定结束元素。