我使用std::erase_if捕获的计数器从容器中删除一半元素,如下所示。C++20 编译为gcc10
#include <iostream>
#include <vector>
#include <map>
#include <unordered_map>
int main()
{
{
std::vector<int> container(10);
std::cout << container.size() << std::endl;
std::erase_if(container, [i = 0u](auto&&...) mutable { return i++ % 2 == 0; });
std::cout << container.size() << std::endl;
}
std::cout << std::endl;
{
std::map<int, int> container;
for (int i = 0; i < 10; i++) {
container.emplace(i, i);
}
std::cout << container.size() << std::endl;
std::erase_if(container, [i = 0u](auto&&...) mutable { return i++ % 2 == 0; });
std::cout << container.size() << std::endl;
}
std::cout << std::endl;
{
std::unordered_map<int, int> container;
for (int i = 0; i < 10; i++) {
container.emplace(i, i);
}
std::cout << container.size() << std::endl;
std::erase_if(container, [i = 0u](auto&&...) mutable { return i++ % 2 == 0; });
std::cout << container.size() << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
输出是意外的。对于向量,删除一个额外的元素:
10
4
10
5
10
5
Run Code Online (Sandbox Code Playgroud)
我打印出结果,看起来像是vector[1]意外删除的元素
当然,这通常不是擦除 if 的正常用法,但我仍然很好奇为什么它只发生在矢量而不是其他地图上。我猜这与迭代器类型恶作剧有关。如果有人能给出详细的解释,我们将不胜感激。