首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在数组上使用迭代器

在数组上使用迭代器
EN

Stack Overflow用户
提问于 2014-05-08 13:33:19
回答 4查看 14.8K关注 0票数 17

C++底漆中指出

在C++中,指针和数组紧密地交织在一起。特别是,正如我们将看到的那样,当我们使用数组时,编译器通常会将数组转换为指针

我想用迭代器打印数组。下面的程序运行良好,但是当我试图打印arr2arr3时,如果我没有弄错,这是int *类型,我会得到一个错误(判断&操作符意味着下面的引用)。

error: no matching function for call to ‘begin(int*&)’

代码语言:javascript
复制
int main(int argc, char** argv) {

    int arr[] = {0,1,2,3,4,5,6,7,8,9};
    auto arr2 = arr;
    auto arr3(arr);   // I think arr2 and arr3 are of same type

    for(auto it = std::begin(arr) ; it != std::end(arr) ; ++it)
        std::cout << *it << " ";
    std::cout << std::endl;

    return 0;
}

考虑到这个语句,如果一个数组被编译器转换成一个指针,那么这个程序如何使用std::begin()std::end()打印std::begin()std::end()的内容,如果它们都是指向整数的指针,那么arr2arr3就不起作用了?

编辑

如果我不能说清楚的话我很抱歉。我希望我能通过编辑来澄清这个问题。

现在我已经知道begin()end()不能处理指针了(感谢答案),我不知道引用的文本是否为真,因为它指定存在数组->指针转换。如果文本所说的是正确的,那么arr的类型应该是一个指针。在这一点上,引用的文本是否有问题?

另外,我是否可以使用begin()end()对指针(而不是STL容器)指定大小,可能使用以下构造函数?

代码语言:javascript
复制
template< class T, size_t N > 
T* begin( T (&array)[N] );
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-05-08 14:14:54

数组很容易转换为指针,但并不总是如此。例如,如果您获取数组的地址或获取引用,那么原始数组类型不会丢失:

代码语言:javascript
复制
int a[10];
int (&ar)[10] = a; // fine
int (*ap)[10] = &a; // also fine

但是,当以复制大多数其他类型的方式使用数组时,数组将转换为指针,而指针将被复制。

在您的示例中,如果将arr2设置为引用,则可以使用它:

代码语言:javascript
复制
 auto &arr2 = arr;

现在,arr2的类型是int (&)[10],而不是int *

票数 8
EN

Stack Overflow用户

发布于 2014-05-08 13:39:08

因为std::begin是为数组定义的,而不是为指针定义的。数组类型与指针类型不一样。

这里的问题是,显然,auto arr2 = arr将类型从数组类型降级为指针类型。

请注意,问题实际上在std::end中,而不是在std::begin中。毕竟,当std::end只有一个指向第一个元素的指针时,它如何能够给出指向last+1元素的指针呢?它不能,因此不能为指针类型定义std::end,因此std::begin对指针类型没有任何意义。

准确地说,arr的类型是int[10],而arr2arr3的类型是int*。前者可以降解为后者,但反之亦然。

票数 3
EN

Stack Overflow用户

发布于 2014-05-08 13:43:21

在这里,auto将将arr (数组类型)衰减为指针。std:开始std::结束都只能用于容器或数组,而不能用于指针。

来自C++11标准

§7.1.6.4自动说明符 dcl.spec.auto 1自动类型说明符表示,被声明的变量的类型应从其初始化器中推导出来,或者函数声明器应包括尾随-返回类型。

代码不能在这里工作,因为auto不能推断数组类型。就像:

代码语言:javascript
复制
char a[5];
auto b[5] = a;  // error, a evaluates to a pointer, which does
                // not match the array type

要使其工作,只需使用C++容器(如std::vector )

代码语言:javascript
复制
vector<int> arr = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23543300

复制
相关文章

相似问题

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