gpt4 book ai didi

c++ - 是否有理由在 erase-remove 习语之外使用 `remove`?

转载 作者:可可西里 更新时间:2023-11-01 18:26:49 29 4
gpt4 key购买 nike

就算法而言,从连续数组中删除一组元素可以分两部分有效地完成。

  1. 将所有不删除的元素移到数组的前面。
  2. 将数组标记得更小。

这可以在 C++ 中使用 erase-remove 习惯用法来完成。

vector<T> v; // v = {0,1,2,3,0,0,7};
vector<T>::iterator it = remove(v.begin(),v.end(),e);
// move all elements not to be deleted to the front
// Yes, remove is not the brightest name for that.
// Especially as list::remove really remove elements from the list.
// now v = {1,2,3,7,?,?,?} results marked in question marks
// are implementation dependent.
v.erase(it,v.end());
// get rid of the elements marked as question marks.
// v = {1,2,3,7}

现在,问号中的元素内容是未知的。我们唯一能对它们做的就是摆脱它们(通过覆盖它们或删除它们)。

是否存在需要使用 remove 而不是删除的真实情况?我唯一能想到的情况是

copy(src.begin(),src.end(),remove(v.begin(),v.end(),e),v.end());

B 替换所有 A,并要求所有这些新的 B 是连续的。没有太多意义。

编辑:除了连续内存容器(实际上是 dequevector),它对其他任何东西都有意义吗?

如果我确实是正确的,为什么它是作为一个独立的算法实现的,而不是 vector::remove_ifdequeue::remove_if 等。

最佳答案

你的问题走错了路。相反,人们会问“为什么我要为每个容器重复实现这个相同的算法,而不是将其作为一个单独的免费函数”?

分离容器、迭代器和算法背后的关键思想是,当您编写更多算法和更多容器时,不会出现复杂性爆炸。如果你想编写一个具有连续存储的新容器,你可以立即使用 remove(前提是你提供前向或随机访问迭代器),而无需复制任何 代码。

某些容器实现自己的成员版本算法的唯一原因是因为它们可以比通用版本做得更好(例如 std::set::find vs. std::find; 或 list::remove),或者因为它们可以做通用版本不能做的事情(例如 std::list::sortstd::sort)。但如果可以,您应该使用免费版本以获得最大的通用性和通用性。

关于c++ - 是否有理由在 erase-remove 习语之外使用 `remove`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7675045/

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