我正在尝试使用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));
构造迭代器的正确方法是什么?
答案 0 :(得分:5)
std::begin
和std::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
。
答案 1 :(得分:2)
Miles是对的。
但是,如果出于其他原因(例如,它不一定总是数组)而需要迭代器,则可以这样做。
您只需要增加迭代器,而不是从中构造迭代器的数组即可:
reverse(begin(a) + 2, begin(a) + 4);
(当我认为您的意思是end
时,您还写了begin
!)