擦除()向量中的元素不起作用

dbU*_*r11 11 c++ vector

我有一个向量。我需要删除其中的最后 3 个元素。描述了这个逻辑。程序崩溃。可能是什么错误?

vector<float>::iterator d = X.end();
    for (size_t i = 1; i < 3; i++) {
        if (i == 1) X.erase(d);
        else X.erase(d - i);
    }
Run Code Online (Sandbox Code Playgroud)

Pau*_*zie 11

如果向量中至少有 3 个项目,删除最后 3 个项目很简单——只需调用pop_back 3 次:

#include <vector>
#include <iostream>

int main() 
{
    std::vector<float> v = { 1, 2, 3, 4, 5 };
    for (int i = 0; i < 3 && !v.empty(); ++i)
       v.pop_back();

    for ( const auto &item : v ) std::cout << item << ' ';
        std::cout << '\n';
}
Run Code Online (Sandbox Code Playgroud)

输出:

1 2
Run Code Online (Sandbox Code Playgroud)


Rem*_*eau 11

将迭代器传递给 1 参数重载是未定义的行为。即使不是,也会使指定元素“位于和之后”的迭代器无效,在第一次循环迭代后使其无效。end()erase()erase()d

std::vector有一个 2 参数erase()重载,它接受一系列要删除的元素。您根本不需要手动循环:

if (X.size() >= 3)
    X.erase(X.end()-3, X.end());
Run Code Online (Sandbox Code Playgroud)

现场演示