为什么没有"按索引删除"对于c ++载体?

时间:2018-04-03 10:40:27

标签: c++ c++-standard-library

我知道我需要写:

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

删除myvector中的第五个位置。

我的问题是为什么?

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

3 个答案:

答案 0 :(得分:3)

  

我的问题是为什么?

因为标准库不提供std::vector的成员函数,该函数使用索引i来删除i个元素。迭代器版本与接口的其余部分相比更加通用和统一。

例如,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});

答案 1 :(得分:3)

为所有STL容器提供统一的接口,这些容器将使用通用算法。

C ++和Python有不同的设计理念。在C ++的情况下,所有STL容器和通用算法都通过迭代器模式连接,每个容器接口尽可能通用。

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

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

答案 2 :(得分:1)

  

我的问题是为什么?

因为这是设计User.user_setup() 界面的方式。

std::vector所有标准C ++容器(完全支持擦除)支持的习惯用法,它支持更多种类的逻辑,而不仅仅是&#34; erase元素在索引&#34;。

我不能代表标准委员会,但我可以推断,因为这个更通用的迭代器擦除可以简单地用于删除索引处的元素,所以没有必要也专门为此提供单独的函数。如果你想拥有这样的东西,很容易编写一个container.erase(iterator)的函数。