gpt4 book ai didi

c++ - STL "erase-remove"习语 : Why not "resize-remove"?

转载 作者:可可西里 更新时间:2023-11-01 15:45:27 26 4
gpt4 key购买 nike

众所周知,从 std::vector 中完全删除所需项的一种好方法是 erase-remove idiom .

如以上链接中所述(截至本文发布日期),在代码中,erase-remove 习惯用法如下所示:

int main()
{
// initialises a vector that holds the numbers from 0-9.
std::vector<int> v = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

// erase-remove idiom to completely eliminate the desired items from the vector
v.erase( std::remove( std::begin(v), std::end(v), 5 ), std::end(v) );
}

我想知道 resize-remove 习惯用法在功能和性能方面是否等同于 erase-remove 习惯用法。或者,也许我遗漏了一些明显的东西?

下面的resize-remove 习语是否等同于上面的erase-remove 习语?

int main()
{
std::vector<int> v = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

// Is this "resize-remove" approach equivalent to the "erase-remove" idiom?
v.resize( std::remove( std::begin(v), std::end(v), 5 ) - v.begin() );
}

最佳答案

在我看来,有两个原因:

  1. std::remove 算法只需要前向迭代器,但是- op 需要随机访问迭代器。

  2. std::remove 的结果意味着“容器的新结束”。从逻辑上讲,我们应该删除[“容器的新端”,“容器的旧端”]。

关于c++ - STL "erase-remove"习语 : Why not "resize-remove"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22860119/

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