为什么大多数C++STL库函数都使用迭代器作为参数

Why most of C++ STL library functions use iterator as parameter?

本文关键字:迭代器 参数 大多数 C++STL 库函数 为什么      更新时间:2024-09-30

指针和迭代器之间没有明显的区别。有人能帮忙吗?提前谢谢。

因为C++迭代器不需要是指针,以迭代器为参数可以让C++用户定义自己的迭代器,并能够使用STL算法。

举个例子,这里是我的玩具项目B-Tree的自定义迭代器:(https://github.com/frozenca/CLRS/blob/main/18/18_B_tree.cpp#L145)

template <bool Const>
struct BTreeIterator {
using difference_type = std::ptrdiff_t;
using value_type = T;
using pointer = std::conditional_t<Const, const T*, T*>;
using reference = std::conditional_t<Const, const T&, T&>;
using iterator_category = std::bidirectional_iterator_tag;
Node* node = nullptr;
std::size_t index;
void Increment() {
if (index == node->key.size()) {
return;
}
if (node->child.empty()) {
++index;
while (node->parent && index == node->key.size()) {
index = node->index;
node = node->parent;
}
} else {
node = node->child[index + 1]->LeftmostLeaf();
index = 0;
}
}
void Decrement() {
if (!node->leaf) {
node = node->child[index]->RightmostLeaf();
index = node->key.size() - 1;
} else {
if (index > 0) {
--index;
} else {
while (node->parent && node->index == 0) {
node = node->parent;
}
if (node->index > 0) {
index = node->index - 1;
node = node->parent;
}
}
}
}
BTreeIterator() = default;
BTreeIterator(Node* node, std::size_t i) : node {node}, index {i} {
assert(node && i <= node->key.size());
}
reference operator*() const {
return node->key[index];
}
pointer operator->() const {
return node->key.begin() + index;
}
BTreeIterator& operator++() {
Increment();
return *this;
}
BTreeIterator operator++(int) {
BTreeIterator temp = *this;
Increment();
return temp;
}
BTreeIterator& operator--() {
Decrement();
return *this;
}
BTreeIterator operator--(int) {
BTreeIterator temp = *this;
Decrement();
return temp;
}
};

// ...
using iterator = BTreeIterator<false>;
using const_iterator = BTreeIterator<true>;
using reverse_iterator = std::reverse_iterator<iterator>;
using const_reverse_iterator = std::reverse_iterator<const_iterator>;

由于我提供了iterator_categorydifference_typevalue_typepointerreference,所以类BTreeIterator可以用于为我的B树应用循环、std::copystd::accumulate等的范围。

我没有得到指针和迭代器之间的明显区别。

Iterator是一个类型的概念,其实例可以指向对象,并且可以递增以指向下一个同级元素。

指向同一容器的一对迭代器表示容器中的一系列对象。

指针可以指向一个对象,如果指向的对象是数组的一个元素,则指针可以递增以指向数组的下一个元素。指针是数组类型的迭代器的一个示例。对于其他容器类型,除了指针之外还有其他迭代器类型。

为什么大多数C++STL库函数都使用迭代器作为参数?

这些函数是对对象序列进行操作的算法的实现,无论保存对象的数据结构如何,它们基本上都保持不变。

如果您有一个对象数组,可以通过将一对指针传递到数组中的一系列对象中来使用该函数;如果您有另一个容器,则可以使用一对迭代器来指向该容器的元素。

能够使用任何(应用限制(迭代器调用函数,允许我们将这些函数与任何容器一起使用。

;STL";又称标准模板库,主要由亚历山大·斯蒂凡诺夫在80年代至90年代提出。迭代器(设计(模式在当时仍然相当新颖和流行。

你必须想象一下,当时的计算机不是很强大,所以性能是个问题。编译时间也很长。在此之前,内存寻址是用指针算术完成的。但这既不安全(容易出错(,也有局限性,因为并非所有对象(即vector<bool>中的位(都可以使用指针访问。迭代程序形成了一个抽象层。然而,当时人们已经在抱怨这个非常小的层,因为它会增加已经很长的编译时间。因此,一个更复杂的解决方案甚至是不可行的。

STL的好处在于算法的组成。(它们有意地结合在一起,形成了一种稳定的部分。(

迭代程序也提供一些控制,例如

std::copy(vec.rbegin()+1, vec.rend()-1, std::back_inserter(other));

以相反的顺序处理vec中的元素,第一个和最后一个除外,同时将它们插入other的后面。