gpt4 book ai didi

c++ - 进一步的 std::set 问题

转载 作者:搜寻专家 更新时间:2023-10-31 02:01:15 24 4
gpt4 key购买 nike

我问了this question更早。我对 std::set 很感兴趣,但我有另一个令人困惑的场景。

即,以下代码对于 T=std::vector 和 T=std::set 是否合法,可移植的 c++:

template <typename T>
void remove_elements(T& collection, int removal_value)
{
typename T::iterator new_end =
std::remove(collection.begin(), collection.end(), removal_value);
collection.erase(new_end, collection.end());
}

根据SGI reference,set::iterator 和set::const_iterator 是一样的,所以我不知道这是否合法。但是,无论类型如何,我似乎都找不到另一种方法来获得我需要工作的操作。我可以求助于模板特化,但如果一开始就不必特化就好了。

最佳答案

erase-remove 习语仅适用于序列容器。对于标准的关联容器,它不会起作用,解决方案也不是那么简单。

两种方法:

  1. 使用remove_copy_if复制所有值到另一个临时容器,然后交换内容原始容器与那些临时的。 [引用我的answer相关问题]
  2. 另一个是循环行走当您将迭代器传递给删除时,容器元素和 post 递增迭代器。

有关更多详细信息,请参阅此 Q:remove_if equivalent for std::map

另外,请参阅第 9 项。仔细选择 Scott Meyers 的 Effective STL 中的删除选项。

关于c++ - 进一步的 std::set 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/914184/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com