簡體   English   中英

如何在數組中間構造開始和結束迭代器?

[英]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::beginstd::end是接受容器並為您提供分別指向第一個和最后一個元素的迭代器的函數。

std::beginstd::end本身不是迭代器,並且由於指針沒有任何大小信息,因此它們不適用於原始指針。 當您調用std::begin(a+2) ,衰減a衰減為指向其第一個元素的指針,並移動2個元素。 結果指針將傳遞給std::begin ,但std::begin不適用於指針,因此結果是編譯失敗。

要解決您的問題,只需擺脫對std::beginstd::end的調用即可:

std::reverse(a+2, a+4);

這是可行的,因為指針滿足了迭代器的所有要求,因此由a+2a+4得出的指針完全有效,可以傳遞給std::reverse

邁爾斯是對的​​。

但是,如果您出於其他原因想要迭代器(例如,它不一定總是數組),則可以這樣做。

您只需要增加迭代器,而不是從中構造它的數組即可:

reverse(begin(a) + 2, begin(a) + 4);

(當我認為您要begin時,您也寫了end !)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM