我假设STL函数只能与STL数据容器(如vector)一起使用,直到我看到这段代码:
#include <functional>
#include <iostream>
#include <numeric>
using namespace std;
int main()
{
int a[] = {9, 8, 7};
cerr << "Sum: " << accumulate(&a[0], &a[3], 0, plus<int>()) << endl;
return 0;
}它使用g++编译和运行,没有任何警告或错误,给出了正确的输出和24。
使用带有STL函数的数组是否允许C++/STL 标准的?如果是,像数组这样的古老结构如何适应模板化迭代器、容器和函数的大STL计划?此外,在这样的用法中是否有任何警告或细节,程序员应该谨慎使用呢?
发布于 2009-04-03 10:59:22
你问的是数组的事。您可以轻松地获得指向其元素的指针,因此基本上可以归结为指针是否可以与STL函数一起透明地使用的问题。指针实际上是最强大的迭代器。有不同的种类
现在,第二组中的每个迭代器都支持前面提到的所有迭代器的所有内容。指针模拟了最后一类迭代器--随机访问迭代器。您可以添加/减去任意整数,也可以读写。除了输出迭代器之外,所有这些都有一个operator->,可以用来访问我们迭代的元素类型的一个成员。
通常,迭代器有几个类型作为成员。
std::distance返回)。std::input_iterator_tag,.,std::random_access_iterator_tag。算法可以使用它来重载不同类型的迭代器(比如std::distance对于随机访问迭代器来说更快,因为它只返回a - b)。现在,指针当然没有这些成员。C++有一个iterator_traits模板,专门用于指针。因此,如果您想获得任何迭代器的值类型,则需要
iterator_traits<T>::value_type不管是指针还是其他迭代器,它都会给出迭代器的value_type。
因此-是的,指针可以很好地与STL算法一起使用。正如其他人所提到的,即使是std::vector<T>::iterator也可以是T*。指针甚至是迭代器的一个很好的例子。因为它非常简单,但同时又非常强大,可以在一个范围内迭代。
发布于 2009-04-03 10:05:21
该标准设计了迭代器,以尽可能地感觉到指针,并尽可能地执行类似指针的操作。另外,由于迭代器是基于模板的,唯一相关的事情是迭代器类型定义了正确的运算符。结果是指针的行为就像随机访问迭代器一样。
实际上,std::vector<T>::iterator的一个可能的实现就是使它成为一个T*。
当然,对于一个数组,您将没有找到有效迭代器范围的有用的begin()和end()方法,但这正是C样式数组的问题所在。
编辑:实际上,正如注释和其他答案中提到的那样,如果数组不是动态的,并且没有衰减为指针,则可以为数组实现这些函数。但我的基本观点是,在使用标准容器时,您必须更加小心。
发布于 2009-04-03 14:13:11
简单回答: STL算法通常被定义为与各种迭代器一起工作。迭代器是由它的行为定义的:它必须是用*解除引用的,它必须是用++递增的,还有定义它是哪种迭代器的其他各种东西(最常见的是随机访问)。请记住,STL算法是模板,所以问题在于语法。类似地,定义了operator()的类实例在语法上就像函数一样工作,因此它们可以互换使用。
指针完成所有需要的随机访问迭代器。因此,它是一种随机访问迭代器,可用于STL算法中.您可以查看向量实现;您很可能会发现vector<whatever>::iterator是一个whatever *。
这并不使数组成为有效的STL容器,但它确实使指针成为有效的STL迭代器。
https://stackoverflow.com/questions/713309
复制相似问题