我知道我需要写:
myvector.erase (myvector.begin()+5)
删除myvector
中的第五个位置。
我的问题是为什么?
在python中我可以写:del myvector[5]
。
答案 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)
的函数。