为什么std :: vector erase需要begin()?

时间:2017-04-04 10:23:06

标签: c++ vector iterator

为什么我们必须写v.erase(v.begin(), v.begin()+3)

为什么不将其定义为erase(int, int),以便您可以编写v.erase(0,2)并且实现会处理begin()

2 个答案:

答案 0 :(得分:6)

接口DoSomething.doIt(new DoSomething.MyListener() { Override public void onDone(String result) { lblHelloWorld.setText(result); } }); 更通用,适用于没有索引的容器,如container.erase(iterator, iterator)。如果您编写模板并且不确切地知道代码要处理哪个容器,这是一个优势。

原始设计旨在尽可能通用,迭代器比索引更通用。设计者可能std::list添加了额外的基于索引的重载,但决定不这样做。

答案 1 :(得分:1)

在STL中,迭代器是唯一提供对STL容器的一般访问的实体。

可以通过指针和索引访问数组数据结构。迭代器是这些索引/指针的泛化 可以使用移动指针(la <TabControl ItemsSource="{Binding myObservableCollection}"> <TabControl.ItemContainerStyle> <Style TargetType="TabItem"> <Setter Property="Visibility" Value="Collapsed" /> </Style> </TabControl.ItemContainerStyle> <TabControl.ContentTemplate> <DataTemplate> <TextBlock>content...</TextBlock> </DataTemplate> </TabControl.ContentTemplate> </TabControl> )访问链接列表。迭代器是对这些的概括。
Trees和HashTables需要特殊的迭代器类,它封装了迭代这些数据结构的逻辑。

正如您所看到的,迭代器是一般类型,它允许您对数据结构执行常见操作(如迭代,删除等),无论它们的底层实现如何。

这样,您可以重构代码以使用ptr = ptr->nextstd::list仍可正常工作而无需修改代码。