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编译的。