首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
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

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
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23543300

复制
相关文章

相似问题

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