首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++ STL:数组可以透明地与STL函数一起使用吗?

C++ STL:数组可以透明地与STL函数一起使用吗?
EN

Stack Overflow用户
提问于 2009-04-03 10:00:18
回答 9查看 10.3K关注 0票数 24

我假设STL函数只能与STL数据容器(如vector)一起使用,直到我看到这段代码:

代码语言:javascript
复制
#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计划?此外,在这样的用法中是否有任何警告或细节,程序员应该谨慎使用呢?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2009-04-03 10:59:22

你问的是数组的事。您可以轻松地获得指向其元素的指针,因此基本上可以归结为指针是否可以与STL函数一起透明地使用的问题。指针实际上是最强大的迭代器。有不同的种类

  • 输入迭代器:只向前和一次通过,只读取
  • 输出迭代器:只向前和一次传递,并且只写
  • 转发迭代器:只转发和读/写
  • 双向迭代器:向前和向后,以及读写
  • 随机访问迭代器:一口气前进和后退的任意步骤,以及读写

现在,第二组中的每个迭代器都支持前面提到的所有迭代器的所有内容。指针模拟了最后一类迭代器--随机访问迭代器。您可以添加/减去任意整数,也可以读写。除了输出迭代器之外,所有这些都有一个operator->,可以用来访问我们迭代的元素类型的一个成员。

通常,迭代器有几个类型作为成员。

  • value_type -迭代器迭代的内容(int,bool,string,.)
  • 引用-对value_type的引用
  • 指针-指向value_type的指针
  • difference_type -两个迭代器之间的距离是什么类型(由std::distance返回)。
  • iterator_category -这是一种标记类型:它被键入为表示迭代器类型的类型。或者std::input_iterator_tag,.,std::random_access_iterator_tag。算法可以使用它来重载不同类型的迭代器(比如std::distance对于随机访问迭代器来说更快,因为它只返回a - b)。

现在,指针当然没有这些成员。C++有一个iterator_traits模板,专门用于指针。因此,如果您想获得任何迭代器的值类型,则需要

代码语言:javascript
复制
iterator_traits<T>::value_type

不管是指针还是其他迭代器,它都会给出迭代器的value_type。

因此-是的,指针可以很好地与STL算法一起使用。正如其他人所提到的,即使是std::vector<T>::iterator也可以是T*。指针甚至是迭代器的一个很好的例子。因为它非常简单,但同时又非常强大,可以在一个范围内迭代。

票数 42
EN

Stack Overflow用户

发布于 2009-04-03 10:05:21

该标准设计了迭代器,以尽可能地感觉到指针,并尽可能地执行类似指针的操作。另外,由于迭代器是基于模板的,唯一相关的事情是迭代器类型定义了正确的运算符。结果是指针的行为就像随机访问迭代器一样。

实际上,std::vector<T>::iterator的一个可能的实现就是使它成为一个T*

当然,对于一个数组,您将没有找到有效迭代器范围的有用的begin()end()方法,但这正是C样式数组的问题所在。

编辑:实际上,正如注释和其他答案中提到的那样,如果数组不是动态的,并且没有衰减为指针,则可以为数组实现这些函数。但我的基本观点是,在使用标准容器时,您必须更加小心。

票数 18
EN

Stack Overflow用户

发布于 2009-04-03 14:13:11

简单回答: STL算法通常被定义为与各种迭代器一起工作。迭代器是由它的行为定义的:它必须是用*解除引用的,它必须是用++递增的,还有定义它是哪种迭代器的其他各种东西(最常见的是随机访问)。请记住,STL算法是模板,所以问题在于语法。类似地,定义了operator()的类实例在语法上就像函数一样工作,因此它们可以互换使用。

指针完成所有需要的随机访问迭代器。因此,它是一种随机访问迭代器,可用于STL算法中.您可以查看向量实现;您很可能会发现vector<whatever>::iterator是一个whatever *

这并不使数组成为有效的STL容器,但它确实使指针成为有效的STL迭代器。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/713309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档