gpt4 book ai didi

c++ - 在数组上使用迭代器

转载 作者:IT老高 更新时间:2023-10-28 22:21:28 28 4
gpt4 key购买 nike

C++ Primer 中有说明那个

In C++ pointers and arrays are closely intertwined. In particular, as we’ll see, when we use an array, the compiler ordinarily converts the array to a pointer.

我想使用迭代器来打印数组。下面的程序运行良好,但是当我尝试打印 arr2arr3 时,如果我没记错的话,它的类型是 int *,我收到一个错误(判断 & 运算符表示下面的引用)。

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

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()打印arr的内容和 std::end() 并且不适用于 arr2arr3 如果它们都是指向整数的指针?


编辑

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

现在我知道 begin()end() 不适用于指针(感谢答案),我想知道引用的文本是否是不正确,因为它指定存在 Array -> Pointer 转换。如果文本所说的是真的,那么 arr 的类型应该是一个指针。此时引用的文字有问题吗?

另外,有什么方法可以使用 begin()end() 指定大小的指针(不是 STL 容器),可能使用以下构造函数?

template< class T, size_t N > 
T* begin( T (&array)[N] );

最佳答案

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

int a[10];
int (&ar)[10] = a; // fine
int (*ap)[10] = &a; // also fine

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

在您的示例中,如果您将其作为引用,则可以使用 arr2:

 auto &arr2 = arr;

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

关于c++ - 在数组上使用迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23543300/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com