为什么 c++ 向量没有"delete by index"?

Why is there no "delete by index" for c++ vectors?

本文关键字:delete by index c++ 向量 为什么      更新时间:2023-10-16

我知道我需要写:

myvector.erase (myvector.begin()+5)

删除myvector中的第五个位置。

我的问题是为什么?

在python中,我可以写: del myvector[5]

为了提供所有将与通用算法一起使用的STL容器的均匀接口。

C 和Python具有不同的设计理念。对于C ,所有STL容器和通用算法都是通过迭代图案连接的,并且每个容器接口都尽可能通用。

从STL容器中删除项目的常见接口需要是迭代器,因为索引特定于基于索引的数据结构,例如向量。但是关联容器,例如地图,不是基于索引的,因此无法删除索引。

您不能从基于索引的容器中删除索引,并从关联容器中删除键,因为在设计中,不可能编写可以从两种类型的容器中删除的通用算法。

我的问题是为什么?

由于标准库未为std::vector提供索引i来删除i -TH元素的成员函数。迭代器版本更加通用和均匀,其余的接口。

为例,std::find_if返回迭代器。您通常想删除std::find_if返回的结果。每次将迭代器转换为索引很不方便。


实施您想要的东西是微不足道的:

template <typename Container>
void erase_nth(Container& c, std::size_t i)
{
    c.erase(std::begin(c) + i);
}

用法:

std::vector<int> v{0, 1, 2, 3, 4};
erase_nth(v, 2);
assert(v == std::vector<int>{0, 1, 3, 4});

我的问题是为什么?

因为这是设计std::vector的接口的方式。

container.erase(iterator)是一个由 All 标准C 容器(完全支持擦除(支持的成语,它比简单的"擦除元素"。>

我不能为标准委员会讲话,但是我可以认为,由于可以在索引上进行详细使用该更通用的迭代器擦除以删除元素,因此也没有必要为此提供独立的功能。如果您想拥有这样的东西,很容易编写一个 vector_arg.erase(vector_arg.begin() + index_arg)的函数。