std :: vector去除满足某些条件的元素

问题描述 投票:22回答:3

正如标题所述,我要删除/合并满足特定条件的向量中的对象。我的意思是我知道如何从向量中删除整数,例如值99。

[Scott Meyers的删除成语:

vector<int> v;
v.erase(remove(v.begin(), v.end(), 99), v.end());

但是,如果有一个包含延迟成员变量的对象向量。现在,我想消除所有延迟相差仅小于特定阈值的对象,并希望将它们组合/合并到一个对象。

处理的结果应该是对象的向量,其中所有延迟的差应至少为指定的阈值。

c++ vector stl
3个回答
32
投票

std::remove_if来抢救!

99将被std::remove_if代替,它将过滤您的延迟,我将使用lambda函数。

这是示例:

UnaryPredicate

1
投票

使用谓词功能(C ++ 11中的惯用方式:

v.erase(std::remove_if(
    v.begin(), v.end(),
    [](const int& x) { 
        return x > 10; // put your condition here
    }), v.end());

0
投票

一个老问题,但很受欢迎,因此我为此添加了另一个选项。

v.erase(remove_if( v.begin(), v.end(), bind(greater<int>(), _1, 99)), v.end()); 函数保留序列的顺序。那可能非常重要。但是,如果您的程序不关心顺序,也可能会浪费时间。

为了保留顺序,remove_if需要向下移动元素以填充已删除的元素。

让我介绍一下remove_if。与其移动元素以填补空白,不如将元素从末端移动到空隙中。这确实not保留了顺序,但是它可以快得多,特别是在大型数组中。

这里是一个示例程序:

partition

我像这样在带有GCC的Linux上编译它:#include <algorithm> #include <chrono> #include <iostream> #include <iterator> #include <memory> #include <string> #include <vector> using namespace std; struct Event { chrono::nanoseconds delay; string name; friend ostream &operator<<(ostream &os, const Event &e) { return os << "{ \"delay\": " << e.delay.count() << ", \"name\": \"" << e.name << "\" }"; } }; template <typename T> ostream &operator<<(ostream &os, const vector<T> &container) { bool comma = false; os << "[ "; for (const auto &x : container) { if (comma) os << ", "; os << x; comma = true; } os << " ]"; return os; } int main() { vector<Event> iv = { {0ms, "e1"}, {10ms, "e2"}, {11ms, "e3"}, {0ms, "e4"}, {12ms, "e5"}, {8ms, "e6"}, {13ms, "e7"}, }; iv.erase(partition(begin(iv), end(iv), [](const auto &x) { return x.delay > 0ns; }), end(iv)); cout << iv << '\n'; return 0; }

并运行:g++ -Wall -W -pedantic -g -O3 -std=c++17 partition-test.cpp -o partition-test

让我也介绍一个有趣的命令行工具,名为./partition-test [ { "delay": 13000000, "name": "e7" }, { "delay": 10000000, "name": "e2" }, { "delay": 11000000, "name": "e3" }, { "delay": 8000000, "name": "e6" }, { "delay": 12000000, "name": "e5" } ],又名JSON查询:

jq

这也是一个很棒的JSON格式化程序。易于阅读。

现在您可以看到,“ e7”和“ e6”填充了延迟== 0的已擦除事件对象。并且该数组不再按顺序排列。

© www.soinside.com 2019 - 2024. All rights reserved.