【问题标题】:How to remove elements from a vector based on entries in another vector?如何根据另一个向量中的条目从向量中删除元素?
【发布时间】:2018-11-01 05:26:02
【问题描述】:

我已经搜索了 stackoverflow 并找到了我的问题的部分答案: How to remove elements from a vector based on a condition in another vector? 在我的例子中,我有两个向量,一个包含整数,一个包含共享指针 (std::shared_ptr),我无法计算出指针算法以使代码正常工作。

class someAbstractClass
{     
};

class someClass : public someAbstractClass
{
};    

std::vector<int> condition;
std::vector<std::shared_ptr< someAbstractClass >> container;

condition.push_back(0);
condition.push_back(1);
condition.push_back(0);

container.push_back( std::make_shared< someClass > );
container.push_back( std::make_shared< someClass > );
container.push_back( std::make_shared< someClass > );

std::erase( std::remove_if( container.begin(), conatiner.end(),
           [&] ( const std::shared_ptr< someAbstractClass > &s ) 
           { 
               return condition[ &s - &(*container.begin()) ] == 1;
           } ), container.end() );

有没有办法让它工作?

【问题讨论】:

    标签: c++ stl shared-ptr


    【解决方案1】:

    您正在将shared_ptr 对象相互比较。您需要比较这些对象的地址。并且 lambda 需要通过 reference 获取其输入参数,以确保它使用向量中原始对象的地址而不是内存中其他位置的对象的 副本 .

    container.erase(
        std::remove_if(
            container.begin(), container.end(),
            [&](const std::shared_ptr<someType> &s) {
                return condition[ &s - &(*container.begin()) ] == 1;
            }
        ),
        container.end()
    );
    

    Live Demo

    将其与您链接到的the accepted answerthe question 中的以下sn-p 进行比较:

    a.erase(remove_if(begin(a), end(a),
        [b&](const myClass& d) { return b[&d - &*begin(a)].alive(); }),
        end(a));
    

    看到相似之处了吗?

    减去连续内存容器中两个有效元素的类型地址,例如std::vector,会在两个元素之间产生偏移。并且当较低地址用于容器的第一个元素时,该偏移量实际上与较高地址的索引相同。这就是本示例中的指针算法如何能够在condition 中获取 lambda 参数的索引(前提是condition 至少具有与container 一样多的元素)。

    【讨论】:

    • 感谢您快速详细的回答。应用更改后,我仍然无法编译代码。 "不匹配 operator== -> 操作类型 std::shared_ptr 和 const std::shared_ptr&"
    • 确实该错误消息没有多大意义。可能有助于了解我们正在谈论的实现。
    • @RemyLebeau 这看起来确实是特定于实现的。容器向量包含一个抽象类的对象。
    • @user1638795 不,它不是特定于实现的,我所说或展示的内容没有任何不标准的地方。不,向量包含shared_ptr 对象,它们不是抽象的。无论shared_ptr 对象持有什么都与这个问题无关
    • @RemyLebeau 我认为我的最后评论没有明确表述。我编辑了问题以使其更接近我的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-21
    • 2015-07-19
    • 1970-01-01
    相关资源
    最近更新 更多