相关疑难解决方法(0)

擦除矢量::从矢量结束

我使用时它是否正常(无效)

 vector<T> v;
 v.erase(v.end());
Run Code Online (Sandbox Code Playgroud)

我想用类似的东西

 v.erase(std::find(...));
Run Code Online (Sandbox Code Playgroud)

我应该ifv.end()还是不是?
C++.comCPPreference上没有关于它的信息

c++ iterator vector erase language-lawyer

33
推荐指数
3
解决办法
1万
查看次数

为什么标准不提供擦除删除习惯用语的便利助手?

从STL中的集合中删除项目需要使用经常使用的技术,这已成为一种成语:擦除 - 删除 - 成语

这个成语最常见的用法之一是T从a中删除一个类型的项目vector<T>

std::vector<Widget> widget_collection;
Widget widget;

widget_collection.erase(
    std::remove(widget_collection.begin(), widget_collection.end(), widget), 
    widget_collection.end());
Run Code Online (Sandbox Code Playgroud)

这显然非常冗长,违反了DRY原则 - 有问题的载体需要4次.

所以我的问题是为什么标准不提供方便助手?

就像是

widget_collection.erase_remove(widget);
Run Code Online (Sandbox Code Playgroud)

要么

std::erase_remove(widget_collection, widget);
Run Code Online (Sandbox Code Playgroud)

这显然可以扩展到

widget_collection.erase_remove_if(widget, pred);
Run Code Online (Sandbox Code Playgroud)

等等...

c++ stl erase-remove-idiom c++17

4
推荐指数
1
解决办法
578
查看次数

从矢量C++中删除最后一个元素时的分段错误

我创建了一个简单的C++程序来测试C++向量中erase()的行为.

这是我的代码:

#include <iostream>
#include <vector>
using namespace std;

int main() {
    // your code goes here

    vector<int> vec;

    vec.push_back(3);
    vec.push_back(4);
    vec.push_back(5);

    cout << vec[0] << " " << vec[1] << " " << vec[2] << endl;

    vec.erase(vec.end());
    //vec.erase(vec.begin());

    cout << vec.size() << endl;

    vec.push_back(12);
    vec.push_back(10);

    cout << vec[0] << " " << vec[1] << " " << vec[2] << endl;


    return 0;
}
Run Code Online (Sandbox Code Playgroud)

问题是上面的代码在尝试擦除向量中的最后一个元素时给出了分段错误.但是当我使用begin()擦除第一个元素时,它工作正常.我无法理解它背后的原因.任何帮助将受到高度赞赏.

c++ stl stdvector

3
推荐指数
3
解决办法
4093
查看次数