如何在数组中间构造开始和结束迭代器?
How to construct begin and end iterators in the middle of an array?
我正在尝试使用需要两个迭代器的 std::reverse 来反转数组的一部分。当我尝试按如下方式构造迭代器时:
int a[] = {0, 1, 2, 3, 4, 5, 6};
reverse(begin(a + 2), end(a + 4));
我收到一个错误:
template argument deduction/substitution failed:
test.cpp:8:33: note: mismatched types ‘const std::valarray<_Tp>’ and ‘int*’ reverse(begin(a + 2), end(a + 4));
构造迭代器的正确方法是什么?
std::begin
和 std::end
是接受容器并为您提供分别指向第一个和 one-past-the-end 元素的迭代器的函数。
std::begin
和 std::end
本身不是迭代器,它们不适用于原始指针,因为指针没有任何大小信息。当您调用 std::begin(a+2)
时,a
衰减为指向其第一个元素的指针并移动 2 个元素。结果指针被传递给 std::begin
,但是 std::begin
对指针不起作用,所以结果是编译失败。
要解决您的问题,只需摆脱对 std::begin
和 std::end
:
的调用
std::reverse(a+2, a+4);
这是有效的,因为指针满足迭代器的所有要求,所以从 a+2
和 a+4
得到的指针完全有效,可以传递给 std::reverse
。
迈尔斯是对的。
但是,如果您出于其他原因需要迭代器(例如,它不会总是数组),您可以这样做。
您只需递增迭代器,而不是递增您构造它的数组:
reverse(begin(a) + 2, begin(a) + 4);
(当我认为你的意思是 begin
时你也写了 end
!)
我正在尝试使用需要两个迭代器的 std::reverse 来反转数组的一部分。当我尝试按如下方式构造迭代器时:
int a[] = {0, 1, 2, 3, 4, 5, 6};
reverse(begin(a + 2), end(a + 4));
我收到一个错误:
template argument deduction/substitution failed:
test.cpp:8:33: note: mismatched types ‘const std::valarray<_Tp>’ and ‘int*’ reverse(begin(a + 2), end(a + 4));
构造迭代器的正确方法是什么?
std::begin
和 std::end
是接受容器并为您提供分别指向第一个和 one-past-the-end 元素的迭代器的函数。
std::begin
和 std::end
本身不是迭代器,它们不适用于原始指针,因为指针没有任何大小信息。当您调用 std::begin(a+2)
时,a
衰减为指向其第一个元素的指针并移动 2 个元素。结果指针被传递给 std::begin
,但是 std::begin
对指针不起作用,所以结果是编译失败。
要解决您的问题,只需摆脱对 std::begin
和 std::end
:
std::reverse(a+2, a+4);
这是有效的,因为指针满足迭代器的所有要求,所以从 a+2
和 a+4
得到的指针完全有效,可以传递给 std::reverse
。
迈尔斯是对的。
但是,如果您出于其他原因需要迭代器(例如,它不会总是数组),您可以这样做。
您只需递增迭代器,而不是递增您构造它的数组:
reverse(begin(a) + 2, begin(a) + 4);
(当我认为你的意思是 begin
时你也写了 end
!)