通过迭代器从 std::vector 中删除

Nar*_*rek 5 c++ vector std

要从std::vector我中删除迭代器,我可以做以下两件事:

std::vector<int>& vec = myNumbers; // use shorter name
vec.erase(std::remove(vec.begin(), vec.end(), number_in), vec.end());
Run Code Online (Sandbox Code Playgroud)

或者我可以这样做:

auto it = find(vec.begin(), vec.end(), number_in);
vec.erase(it);
Run Code Online (Sandbox Code Playgroud)

我猜第二个更直观,但哪个更快?

编辑: vector 中的元素是唯一的,我们不必担心一次删除多个元素。

Pau*_*zie 2

第一个版本保证可以正常工作,而第二个版本可能会更快(由于std::find停在第一个匹配的项目上),但它肯定并不安全。

auto it = find(vec.begin(), vec.end(), number_in);
if (it != vec.end())
   vec.erase(it);
Run Code Online (Sandbox Code Playgroud)

这将确保您不会删除无效的迭代器。

所以这取决于你的需求。如果您想要一个正确的程序,第一个程序无需进一步干预即可运行,但第二个程序需要客户提供错误票,然后您必须修复它(如上所述)。