标签: erase-remove-idiom

与 if 进行比较时与与存储值进行比较时的 std::vector擦除结果不同

vector::erase由于某种原因,当比较语句内部的返回值if或者先存储值然后比较时,我会得到不同的结果。但这似乎只发生在 g++ 中。

这是使用 g++、libstdc++ 和-std=c++14flag 在 Ubuntu 20.04 AMD64 上构建的。 g++ -std=c++14 foo.cpp && ./a.out

这将返回false

#include <vector>
#include <iostream>
#include <algorithm>

int main()
{
    std::vector<int> v{0, 1, 8, 3, 8, 5, 8, 7,8, 9};
    int thing_id{9};

    std::vector<int>::iterator const cit{
        std::remove_if(v.begin(),
                        v.end(),
                        [thing_id](int const& thing) -> bool {
                            return thing == thing_id;
                        })};

    if (v.erase(cit, v.cend()) == v.cend()) {
        std::cout << "true\n";
        return true;
    }
    else {
        std::cout << "false\n";
        return false;
    } …
Run Code Online (Sandbox Code Playgroud)

c++ libstdc++ comparison-operators erase-remove-idiom qcc

2
推荐指数
1
解决办法
65
查看次数

单个语句方法从容器中删除元素

是否有一个算法可以从容器中删除元素,如下面的代码所示?

vec_it = std::remove_if( vec.begin(), vec.end(), pred );
vec.erase( vec_it, vec.end() );
Run Code Online (Sandbox Code Playgroud)

c++ stl erase-remove-idiom

1
推荐指数
2
解决办法
528
查看次数

删除第一个括号"("和最后一个括号"("包括这些括号C++)之间的字符串中的所有字符

我很难删除第一个括号"("和最后一个括号"("包括它们)之间的所有字符.这是我用来使其工作的测试程序,但没有成功......

#include <iostream>
#include <string>

using namespace std;

int main()
{

    string str = "( 1221 ( 0 0 0 ) (1224.478541112155452 (1.32544e-7 0 0 ) ) )";

    int count = 0;

    for (std::string::size_type i = 0; i < str.size(); ++i)
    {

        if (str[i] == '(')
        {
            count += 1;
        }

        cout << "str[i]: " << str[i] << endl;

        if (count <= 4)
        {

            str.erase(0, 1);
            //str.replace(0, 1, "");

        }

        cout << "String: " << str << endl;

        if (count …
Run Code Online (Sandbox Code Playgroud)

c++ string replace erase erase-remove-idiom

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

如何使用擦除删除成语从struct的向量中擦除值?

如何从struct的vector中删除所有值,其中struct value k等于0?

struct tabuRecord {
int x;
int y;
int k;
tabuRecord( int x, int y, int k)
    : x(x), y(y), k(k){}
};  

vector <tabuRecord> tabu;

v.insert(v.begin(), tabuRecord(1, 2, 3));
v.insert(v.begin(), tabuRecord(4, 5, 0));
v.insert(v.begin(), tabuRecord(7, 8, 9));
v.insert(v.begin(), tabuRecord(10, 11, 0));
Run Code Online (Sandbox Code Playgroud)

我试过了

tabu.erase(std::remove(tabu.begin(), tabu.end(), tabu.k=0), tabu.end());
Run Code Online (Sandbox Code Playgroud)

tabu.erase(std::remove(tabu.begin(), tabu.end(), tabuRecord.k=0), tabu.end());
Run Code Online (Sandbox Code Playgroud)

c++ struct vector erase-remove-idiom

0
推荐指数
1
解决办法
97
查看次数

为什么`std :: set :: erase(const key_type&)`返回`size_type`而不是`bool`?

由于std::setinsert()重复,因此可以确保包含唯一元素。使用重载时erase(const key_type&),其对象将最多包含1个相同值的元素。因此,它可能返回1(如果存在)或0(否则)。

什么时候可以erase(const key_type&)返回超过1?
换句话说,返回a size_type而不是simple 的目的是什么bool

c++ return-type stdset language-lawyer erase-remove-idiom

0
推荐指数
1
解决办法
49
查看次数

C++ Erase-remove Idiom on non-existant value in vector

我想从向量中删除一个元素,但不能保证该元素存在。我在网上查看过,但没有发现有关擦除删除习语如何处理不在容器中的值的信息。

我的向量是这样声明的:(在代码的其他部分中添加/修改了成员)

std::vector<Person*> _members
Run Code Online (Sandbox Code Playgroud)

我想在包含 _members 作为属性的类 Group 中创建一个 remove 方法,以尝试从组中删除给定的人。

我目前正在使用:(要删除的人是指向 Person 对象的指针)

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

这将如何处理试图删除不在向量中的 Person ?理想情况下,我还想返回一个布尔值来确认删除是否成功,我当前的实现有没有办法这样做?

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

0
推荐指数
1
解决办法
120
查看次数

从 std::vector 中删除重复元素但从前面开始?

如何从向量中删除重复元素但从前面开始?

所以

2 3 4 5 2 5 会成为 3 4 2 5

1 5 3 1 会成为 5 3 1

我希望该解决方案易于阅读,如果它也具有良好的性能,那就太好了。

c++ algorithm iterator vector erase-remove-idiom

0
推荐指数
1
解决办法
141
查看次数

向量使用迭代器擦除特定索引(不基于范围或条件)

比如,我在代码中有两个向量,我希望使用迭代器擦除向量"data"中的向量"index_to_filter"索引的元素.代码中的虚拟方式只是指出明显的错误.到目前为止,我无法让它工作,也不知道这是否可以成为擦除 - 删除 - 成语?.有没有办法去错过它?

谢谢.

#include <iostream>
#include <vector>

int main()
{

std::vector<int> data{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
std::vector<int> index_to_filter{ 1, 5, 8 };

/* needed result data = { 0, 2, 3, 4, 6, 7, 9 }*/

std::vector<int>::iterator iter = index_to_filter.begin();
while (iter != index_to_filter.end())
{
    std::vector<int>::iterator iter_data = data.begin() + *iter;
    iter_data = data.erase(iter_data);
    iter++;
}
/* Throws : vector erase iterator outside range */

for …
Run Code Online (Sandbox Code Playgroud)

c++ vector erase erase-remove-idiom

-1
推荐指数
1
解决办法
339
查看次数

如何检查擦除 - 删除操作是否成功?

这是我第一次使用这个成语,我有一个向量v1,其中元素必须是另一个向量中元素的子集v2.现在,想象v1v2作为集合,我想执行v2-v1并抛出异常(如果v1[i]不存在)v2(对于任何有意义的i).

我想出了这个:

std::vector<T> v1;
std::vector<T> v2;
//fill v1, v2 somehow
for(size_t i=0; i<v1.size(); i++){
  v2.erase(std::remove(v2.begin(), v2.end(), v1[i]), v2.end());
  if(/*erase option failed because v1[i] doesn't exists in v2*/)
    throw std::runtime_exception (std::to_string(i)+"-th in v1 doesn't exists in v2!");
}
Run Code Online (Sandbox Code Playgroud)

我该如何填写这个if条件?

c++ erase-remove-idiom

-1
推荐指数
1
解决办法
1049
查看次数