在给定迭代器列表的情况下,如何从向量中删除元素?

Guillaume Racicot

我有一个int向量,还有一个映射,其中包含一些指向该向量的迭代器作为值。我需要从地图上删除键,并且值指向的向量元素。我的代码看起来像这样:

using RenderData = int;
using Element = std::string;

struct Ref {
    std::vector<RenderData>::iterator ref;
    std::function<int()> update;
    bool should_remove;
};

int main() {
    std::vector<RenderData> ints{1, 2, 3, 4, 5, 6, 7, 8, 9};
    std::unordered_map<Element, Ref> elements;

    // Here, I need to remove some elements, and their associated number
}

我实现了一个erase_if看起来像这样功能

所以我的初始代码如下所示:

erase_if(elements, [&](auto&& element) {
    if (element.second.should_remove) {
        ints.erase(element.second.ref);
        return true;
    }

    return false;
});

显然没有用。擦除元素使其他迭代器指向错误的对象,并且在某些情况下超出范围。所以我尝试了:

std::vector<std::vector<RenderData>::iterator> to_remove;

erase_if(elements, [&](auto&& element) {
    // condition based on the string content
    if (element.second.should_remove) {
        to_remove.emplace_back(element.second.ref);
        return true;
    }

    return false;
});

// Sort in descending order
std::sort(to_remove.begin(), to_remove.end(), std::greater<>{});

// stuff

for (auto&& it : to_remove) {
    ints.erase(it); // nothing can go wrong right?
}

再说一次,我有时会删除错误的元素。

给定迭代器存储在某些映射中,是否可以从向量中删除迭代器指向的元素?


更新:

似乎在最后一个片段中,我交换了向量中的某些元素,从而删除了错误的元素。现在它似乎可以工作了,但是我仍然很好奇我们可以采取什么方法来删除迭代器列表中向量中的元素。

也许

使用迭代器版本。注意:

  1. 仅当存在重新分配时,迭代器才无效。
  2. 仅将迭代器替换为index不会改变以下事实:从向量中删除某些值后,它们无效。
  3. 使用索引仍然是一种更好的方法,因为以后添加更多元素时它们不会失效。

方法:使用不应该删除的元素创建矢量的副本

using Element = std::string;
using RenderData = int;
struct Ref {
    std::vector<RenderData>::iterator itr;
    bool should_remove;
};

struct Main {
    std::vector<RenderData> ints;
    std::unordered_map<Element, Ref> elements;
    void remove_stuff(){
        std::vector<RenderData> localCopy;        
        localCopy.swap(ints);
        ints.reserve(localCopy.size());        
        for(auto it = elements.begin(); it != elements.end();) {
            Ref& ref = it->second;
            if(ref.should_remove) {
                it = elements.erase(it);
            } else {
                ints.push_back(std::move(*ref.itr));
                ref.itr = ints.end() - 1;                
                it++;
            }
        }            
    }
};

链接:https//godbolt.org/g/SouZ5E

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在给定特定前缀的情况下使用向量打印Trie中的单词

在给定当前项目列表的情况下,替换字典Python中的元素

在给定约束的情况下,如何查找数组中2个元素的最大差?

postgres:在给定条件的情况下如何计算数组列中的不同元素

如何在给定 MongoDB 中的元素位置的情况下提取数组的切片?

如何在给定 Scala 中的字段列表(键 -> 值)的情况下构建 json 对象

Django 模板 - 如何在给定索引号(由迭代器生成)的情况下访问表单(上下文)中的表单

如何在不迭代的情况下将元素插入向量中的多个位置

在给定具有R的位置和条件的情况下更改向量中的值

如何在给定数据框中的值或索引列表的情况下屏蔽数据框

如何在给定鼠标坐标的情况下检测重叠(旋转)的DOM元素?

python / pandas在给定起点的情况下从数据框中删除行的方法

在给定新名称列表的情况下,如何重命名一组目录?

如何在给定元组列表的情况下创建倒排索引?

如何在给定点列表的情况下制作 networkX 网格并添加边权重?

如何在给定一些kubernetes模板的情况下获取docker映像列表?

在给定起点和终点的情况下检查字符串列表中的路径

如何在不收集临时向量的情况下对结果的迭代器执行迭代器计算?

在给定基数的情况下,如何恢复其MRO?

如何在给定FrameworkElement的情况下检索CompositionEffect?

如何在给定点的情况下绘制区域?

在给定特定PID的情况下如何杀死Java中的进程

如何在给定数字中缺少数字的情况下,用分割数字?

如何在给定MessageDescriptor的情况下创建protobuf消息实例(在dotnet / C#中)

在给定特定条件的情况下,如何使图像显示在HTML中?

如何在给定一组值的情况下找到数组中剩余的 % 值?

R; 在给定向量的情况下向上或向下舍入到给定的X

numpy,在给定索引列表的情况下,是否可以对矩阵(二维数组)的特定元素求和?

Python | 在给定每个索引一定数量范围的情况下,如何将值分组到主列表中的不同列表