c++ - 过滤器列表 - C++

标签 c++ list filter iterator

我想用 C++ 过滤列表。为此,我提供了一个外部函数 f,用于比较元素。根据比较,我决定保留哪些元素。

看来我的实现是错误的,你能帮我找出错误吗?

f 的示例:

bool function f(a, b){
if (a + b % 3 != 0){
    return true; // keep element
}
return false; }

我想强调,这只是一个示例,为了保持简单。

我的实现应该像这样工作(元素用 ___ 分隔):

1____2____3____4____5____6____7____8
^    ^
f(1, 2) == false. Discard 2. 

1____3____4____5____6____7____8
^    ^
now compare the next element with 1 
f(1, 3) == true. Keep 3. Move first pointer to 3

1____3____4____5____6____7____8
     ^    ^
Compare 3 with 4 ...

1____3____4____5____6____7____8
          ^    ^
remove 5, since f(4, 5) == false

1____3____4____6____7____8
          ^    ^
keep 6, move pointer 

1____3____4____6____7____8
               ^    ^
1____3____4____6____7____8
                    ^    ^
remove 8. 

1____3____4____6____7
                    ^
Nothing more to compare. Terminate. 

我通过将有效元素移动到另一个列表并将迭代器移动到原始列表中的下一个元素来实现“删除”,但实际上删除它们也可以。

list<node> result;
list<node>::iterator i = path.begin();
element firstElement = *i;
result.push_back(firstElement);
for (; i != path.end();)
{
    if (++i == path.end())
    {
        break;
    }
    // compare with next node
    int d = distance(firstElement.id, (*i).id);
    if (d <= (*i).valFrom)
    {
        // add edge to result
        result.push_back(*i);
        firstElement = *i;
    }
}

工作示例

#include <iostream>
#include <vector>
#include <climits>
#include <algorithm>
#include <list>

using namespace std;

int f(int a, int b)
{
    if (a + b % 3 == 0)
    {
        return false;
    }
    return true;
}

int main()
{

    list<int> path = {1, 2, 3, 4, 5, 6, 7, 8};
    list<int> result;
    bool skip = false;
    list<int>::iterator i = path.begin();
    int firstint = *i;
    result.push_back(firstint);
    for (; i != path.end();)
    {
        if (++i == path.end())
        {
            break;
        }
        // compare with next int
        if (f(firstint, *i))
        {
            // add edge to result
            result.push_back(*i);
            firstint = *i;
        }
    }

    // output path
    for (list<int>::iterator i = result.begin(); i != result.end(); ++i)
    {
        cout << *i << ' ';
    }
}

最佳答案

我想你想要这样的东西:

std::list<int> mylist{ 1,2,3,4,5,6,7,8,9,10 };

mylist.remove_if([](auto val)
{
    return ((val % 2) == 1);
});

这将从列表中删除所有不均匀的值

如果您想要另一个列表中的结果:

std::list<int> mylist{ 1,2,3,4,5,6,7,8,9,10 };
std::list<int> mylistFilered;

std::copy_if(mylist.begin(), mylist.end(), std::back_inserter(mylistFilered),[](auto val)
{
    return ((val % 2) == 1);
});

对于基于 2 个连续元素的过滤器,我们需要一些辅助列表。例如这样:

std::list<int> mylist{ 1,2,3,5,7,4,5,6,7,8,9,10 };
std::list<int> keepElement;
std::list<int> mylistFilered;

std::transform(mylist.begin(), --mylist.end(), ++mylist.begin(), std::back_inserter(keepElement),[](auto a, auto b)
{
    return ((a + b) % 3 != 0);
});

或者,如果您例如可以使用 -1 作为无效值,如下所示:

std::list<int> mylist{ 1,2,3,5,7,4,5,6,7,8,9,10 };
std::list<int> mylistFilered;

std::transform(mylist.begin(), --mylist.end(), ++mylist.begin(), std::back_inserter(mylistFilered),[](auto a, auto b)
{
    if ((a + b) % 3 != 0)
        return a;
    else
        return -1;
});

mylistFilered.remove_if([](auto val)
{
    return (val == -1);
});

关于c++ - 过滤器列表 - C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50398028/

相关文章:

filter - ZF2 : How do I implement a custom filter?

C++ "Count the number of collisions at each slot in the hash table"

python - 如何分别传播字符串列表?

c++ - 没有模板参数的模板类的容器

c++ - 在 C 或 C++ 中是否使用未初始化的指针?

python - 每个日期的点数总和按列表形式的附加列分组

c# image filter parallel.for 需要更长的时间

javascript - 您如何正确检测浏览器对不透明度的支持?

c++ - 在 Matrix4::Perspective 中反转 Z 轴

c++ - 对类的成员函数的调用如何导致该对象不再是 "delete-able"?