我知道iterator
可以vector
用std::vector::begin
或std::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 ++入门中的这段代码,他们使用begin
和end
来获取迭代器的第一个和一个结束的结束元素:
#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;
}
答案 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::begin
和std::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);