为什么大多数C++STL库函数都使用迭代器作为参数
Why most of C++ STL library functions use iterator as parameter?
指针和迭代器之间没有明显的区别。有人能帮忙吗?提前谢谢。
因为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_category
、difference_type
、value_type
、pointer
、reference
,所以类BTreeIterator
可以用于为我的B树应用循环、std::copy
、std::accumulate
等的范围。
我没有得到指针和迭代器之间的明显区别。
Iterator是一个类型的概念,其实例可以指向对象,并且可以递增以指向下一个同级元素。
指向同一容器的一对迭代器表示容器中的一系列对象。
指针可以指向一个对象,如果指向的对象是数组的一个元素,则指针可以递增以指向数组的下一个元素。指针是数组类型的迭代器的一个示例。对于其他容器类型,除了指针之外还有其他迭代器类型。
为什么大多数C++STL库函数都使用迭代器作为参数?
这些函数是对对象序列进行操作的算法的实现,无论保存对象的数据结构如何,它们基本上都保持不变。
如果您有一个对象数组,可以通过将一对指针传递到数组中的一系列对象中来使用该函数;如果您有另一个容器,则可以使用一对迭代器来指向该容器的元素。
能够使用任何(应用限制(迭代器调用函数,允许我们将这些函数与任何容器一起使用。
;STL";又称标准模板库,主要由亚历山大·斯蒂凡诺夫在80年代至90年代提出。迭代器(设计(模式在当时仍然相当新颖和流行。
你必须想象一下,当时的计算机不是很强大,所以性能是个问题。编译时间也很长。在此之前,内存寻址是用指针算术完成的。但这既不安全(容易出错(,也有局限性,因为并非所有对象(即vector<bool>
中的位(都可以使用指针访问。迭代程序形成了一个抽象层。然而,当时人们已经在抱怨这个非常小的层,因为它会增加已经很长的编译时间。因此,一个更复杂的解决方案甚至是不可行的。
STL的好处在于算法的组成。(它们有意地结合在一起,形成了一种稳定的部分。(
迭代程序也提供一些控制,例如
std::copy(vec.rbegin()+1, vec.rend()-1, std::back_inserter(other));
以相反的顺序处理vec
中的元素,第一个和最后一个除外,同时将它们插入other
的后面。
- 如何在C++中将迭代器作为函数参数传递
- 定义模板参数的迭代器类型
- 当通知迭代器参数初始化为空列表的开头时,list::insert 行为是什么?
- 具有C++迭代器参数的多功能函数
- C++如何获取传递给函数(STL 迭代器)的参数的名称
- 当迭代器(输入参数)通常不是constexpr时,constexpr算法真的有用吗
- 迭代器的模板参数:函数在调用时推断类型?
- 接受迭代器作为参数并存储值的类?
- 我的代码在作为参数传入 .begin() 时不起作用,但在我将 .begin() 转换为迭代器后工作
- 如何使用迭代器作为参数方法?
- 调用模板函数的问题"No matching function for call"参数:迭代器、对象函数
- 使用 std::vector<Particle> 粒子;函数 .at() 不能与迭代器一起使用,它作为 for 循环中的参数
- 如何确保函数模板的参数是随机访问迭代器
- 使用迭代器和可变参数模板的笛卡尔乘积
- 从具有迭代器参数的模板函数返回指针
- 英特尔检查器 XE 2012 警告 #12367 - 将迭代器参数切片传递给 vector::erase()
- 容器不可知迭代器参数
- 将可变迭代器参数转换为值类型的元组
- 模板方法中的迭代器参数出现问题
- 为什么标准库函数中没有提供带有迭代器参数的重载?