C++ 可以在C数组中使用迭代器吗?

C++ 可以在C数组中使用迭代器吗?,c++,arrays,C++,Arrays,我知道,iterator可以用于vector,它可以与std::vector::begin一起使用,也可以与中定义的std::begin一起使用。同样适用于std::end。 我还可以将迭代器与C数组一起使用吗?我尝试了以下方法,但没有成功 #include <iostream> #include <iterator> using std::cin; using std::cout; using std::endl; using std::begin; using st

我知道,
iterator
可以用于
vector
,它可以与
std::vector::begin
一起使用,也可以与
中定义的
std::begin
一起使用。同样适用于
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数组没有长度前缀。如果您有大小,可以创建满足
迭代器
要求的指针:

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

C数组没有长度前缀。如果您有大小,可以创建满足
迭代器
要求的指针:

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

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


通过引用传递,如
void print(int(&arr)[5]){…}
应该可以工作。请注意,如果需要可变大小的数组,则需要模板。

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


通过引用传递,如
void print(int(&arr)[5]){…}
应该可以工作。请注意,如果需要可变大小的数组,则需要模板。

是的,迭代器可用于数组。比如说

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

    for (auto cbeg = cbegin(arr); cbeg != cend(arr); ++cbeg) {
        cout << *cbeg << endl;
}
或者(如果您不想将大小固定为
5
)将

模板无效打印(int(&arr)[N])
{
//和以前一样的身体
}

您会发现它可以工作,因为数组是通过引用传递的。请注意,如果将指针传递给这些函数,它们将不会编译。

是的,迭代器可用于数组。比如说

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

    for (auto cbeg = cbegin(arr); cbeg != cend(arr); ++cbeg) {
        cout << *cbeg << endl;
}
或者(如果您不想将大小固定为
5
)将

模板无效打印(int(&arr)[N])
{
//和以前一样的身体
}

您会发现它可以工作,因为数组是通过引用传递的。请注意,如果将指针传递给这些函数,它们将不会编译。

您似乎在寻找

// 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);
}
//使用数组指针避开函数参数的数组衰减:
无效模糊元编程(int(*arr)[5])
{ 
对于(自动it=std::begin(*arr);it!=std::end(*arr);it++)
{

你好像在找什么

// 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);
}
//使用数组指针避开函数参数的数组衰减:
无效模糊元编程(int(*arr)[5])
{ 
对于(自动it=std::begin(*arr);it!=std::end(*arr);it++)
{

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

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);
}
#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::cin;
使用std::cout;
使用std::endl;
模板无效打印(标准::数组和arr){
用于(常数自动和s:arr){

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

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);
}
#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::cin;
使用std::cout;
使用std::endl;
模板无效打印(标准::数组和arr){
用于(常数自动和s:arr){

也许@EdHeal看不到我的编辑。他们使用了c数组,效果很好。我只需要为常量而做。有什么原因需要这样做吗?为了元编程而进行元编程吗?请注意,普通的c指针是迭代器。这就是为什么
print(const int*arr)
无效!您只传递begin迭代器,但范围由begin和end定义。(或begin和length)也许@EdHeal看到了我的编辑。他们使用了c数组,而且效果很好。我只需要为常量而做。你为什么需要这个?为了元编程而进行元编程?请注意,普通的c指针是迭代器。这就是为什么
print(const int*arr)
不起作用!您只传递begin迭代器,但范围是由begin和end定义的。(或begin和length)我还不熟悉模板关键字,它做了什么?就是这样,但您需要将cbegin()修改为begin()和cend()修改为end()
std::cbegin()
std::cend()
是在C++14中引入的。自从您引入后,我就简单地使用了它们。
模板
关键字引入(至少在本文中)至少是一系列函数。对模板进行更完整的描述需要一篇文章。哦,我的错误,我是用c++0x编译的。我还不熟悉模板关键字,它能做什么?就是这样,但您需要修改cbegin()以开始()和cend()以结束()
std::cbegin()
std::cend()
是在C++14中引入的。我只是简单地使用了它们,因为你这么做了。
模板
关键字至少引入了(至少在本文中)一系列函数。更完整地描述模板需要一篇文章。哦,我的错,我是用C++0x编译的。