我有一个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?
}
再说一次,我有时会删除错误的元素。
给定迭代器存储在某些映射中,是否可以从向量中删除迭代器指向的元素?
更新:
似乎在最后一个片段中,我交换了向量中的某些元素,从而删除了错误的元素。现在它似乎可以工作了,但是我仍然很好奇我们可以采取什么方法来删除迭代器列表中向量中的元素。
使用迭代器版本。注意:
方法:使用不应该删除的元素创建矢量的副本
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++;
}
}
}
};
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句