是否可以在C数组中使用迭代器?

时间:2017-03-10 09:40:27

标签: c++ arrays

我知道iterator可以vectorstd::vector::beginstd::begin定义<iterator>std::end也是如此。 我还可以使用带C数组的迭代器吗?我尝试了以下但是没有用。

#include <iostream>
#include <iterator>

using std::cin;
using std::cout;
using std::endl;
using std::begin;
using std::end;

void print(const int *arr) {
    for (auto cbeg = cbegin(arr); cbeg != cend(arr); ++cbeg) {
        cout << *cbeg << endl;
    }
}

int main() {
    int arr[] = {9, 18, 31, 40, 42};
    print(arr);
}

修改

我认为我可以这样做是因为C ++入门中的这段代码,他们使用beginend来获取迭代器的第一个和一个结束的结束元素:

#include <iterator>
using std::begin; using std::end;

#include <cstddef>
using std::size_t;

#include <iostream>
using std::cout; using std::endl;

// const int ia[] is equivalent to const int* ia
// size is passed explicitly and used to control access to elements of ia
void print(const int ia[], size_t size) 
{
    for (size_t i = 0; i != size; ++i) {
        cout << ia[i] << endl;
    }
}

int main() 
{
    int j[] = { 0, 1 };  // int array of size 2

    print(j, end(j) - begin(j));  

    return 0;
}

5 个答案:

答案 0 :(得分:2)

是的,迭代器可以在数组上使用。例如

int main()
{
    int arr[] = {9, 18, 31, 40, 42};

    for (auto cbeg = cbegin(arr); cbeg != cend(arr); ++cbeg) {
        cout << *cbeg << endl;
}

将打印arr的所有元素。

问题在于,print()函数接受指针,因此在这种情况下不能使用迭代器。

但是,如果您将print()更改为

void print(int(&arr)[5])
{
      // same body as before
}

或(如果您不希望将尺寸固定为5

template<int N> void print(int(&arr)[N])
{
      // same body as before
}

你会发现它会起作用,因为数组是通过引用传递的。请注意,如果将指针传递给它们,这些函数将无法编译。

答案 1 :(得分:1)

您可以在c样式数组上使用std::beginstd::end。你不能在指针上使用它们。 C样式数组在传递给函数时会衰减为指针,除非您通过引用传递它们。动态数组(由new分配)也可以通过指针访问,因此也不起作用。

void print(int (&arr)[5]) {...}这样的引用传递应该有效。如果您想要可变大小的数组,请注意您需要模板。

答案 2 :(得分:0)

你似乎在寻找

// use array pointer to dodge array decay of function parameters:
void obfuscated_meta_programming (int (*arr)[5]) 
{ 
  for(auto it = std::begin(*arr); it != std::end(*arr); it++)
  {
    cout << *it << endl;
  }
}

int main() 
{
    int arr[] = {9, 18, 31, 40, 42};
    obfuscated_meta_programming(&arr);
}

可以用这样一个理智的方式重写:

void print (int arr[5]) 
{
  for(size_t i=0; i<5; i++)
  {
    cout << arr[i] << endl;
  }
}

int main() 
{
    int arr[] = {9, 18, 31, 40, 42};
    print(arr);
}

答案 3 :(得分:0)

不是这样的。您的函数print仅获得const int *指针。这个指针没有关于函数main的数组arr[]长度的信息,所以如果你有指向int作为参数的指针,那么即使理论上,也无法在函数“print”中迭代,无论你是否使用迭代器与否。一种方法是使用std :: array并使用char []初始化它,如下所示:

#include <iterator>
#include <iostream>
#include <array>

using std::cin;
using std::cout;
using std::endl;


template<size_t N> void print(std::array<int,N> &arr) {
    for (const auto &s : arr) {
        cout << s << endl;
    }
}

int main() {
    std::array<int,5> arr = {9, 18, 31, 40, 42};
    print(arr);
}

使用--std = c ++ 11

进行编译

答案 4 :(得分:-1)

C数组的长度不是前缀。如果您有大小,则可以创建满足Iterator要求的指针:

begin = arr;
end = arr + size;
some_algorithm(begin, end);