gpt4 book ai didi

c++ - 删除和删除的区别

转载 作者:IT老高 更新时间:2023-10-28 14:01:47 24 4
gpt4 key购买 nike

我对 std::remove 算法的用法之间的区别有点困惑。具体来说,当我使用此算法时,我无法理解要删除的内容。我写了一个这样的小测试代码:

std::vector<int> a;
a.push_back(1);
a.push_back(2);

std::remove(a.begin(), a.end(), 1);


int s = a.size();

std::vector<int>::iterator iter = a.begin();
std::vector<int>::iterator endIter = a.end();

std::cout<<"Using iter...\n";
for(; iter != endIter; ++iter)
{
std::cout<<*iter<<"\n";
}

std::cout<<"Using size...\n";
for(int i = 0; i < a.size(); ++i)
{
std::cout<<a[i]<<"\n";
}

两种情况下的输出都是 2,2。

但是,如果我将删除与删除一起使用,如下所示:

a.erase(std::remove(a.begin(), a.end(), 1), a.end());

我得到的输出为 2。

所以我的问题是:

(1)。 std::remove 除了与删除功能一起使用外,还有其他用途吗?

(2)。即使在执行 std::remove 之后,为什么 a.size() 返回 2 而不是 1?

我在 Scott Meyer 的 Effective STL 书中阅读了有关删除删除习语的内容。但我仍然有这种困惑。

最佳答案

remove() 实际上并没有从容器中删除元素——它只是将未删除的元素向前分流到已删除元素的顶部。关键是要意识到 remove() 不仅适用于容器,而且适用于任意前向迭代器对:这意味着它不能 实际上删除元素,因为任意迭代器对不一定具有删除元素的能力。

例如,指向常规 C 数组开头和结尾的指针是前向迭代器,因此可以与 remove() 一起使用:

int foo[100];

...

remove(foo, foo + 100, 42); // Remove all elements equal to 42

这里很明显 remove() 无法调整数组的大小!

关于c++ - 删除和删除的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/799314/

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