C++でのイテレータの参照
C++でイテレータを関数の引数として渡すときに参照渡しをすることにしたが, const参照を渡した場合にイテレータが指している値を変更可能なのかどうか確認してみた.
#include <iostream> #include <vector> int main() { std::vector<int> vec = {0, 0, 0, 0, 0}; std::cout << "vec: "; for (auto i: vec) std::cout << i << " "; std::cout << std::endl; // std::vector<int>::const_iterator const_itr(vec.begin() + 2); //エラー: assignment of read-only location // const std::vector<int>::iterator itr(vec.begin() + 2); // OK std::vector<int>::iterator itr(vec.begin() + 2); const std::vector<int>::iterator& itr_const_ref(itr); (*itr_const_ref) = 5; std::cout << "vec: "; for (auto i: vec) std::cout << i << " "; std::cout << std::endl; return 0; }
結果は以下のように無事値が変わっている.
vec: 0 0 0 0 0 vec: 0 0 5 0 0
要するにポインタを渡すときと同様にイテレータ自体を置き換えることはできないが, イテレータが指しているものを変更するのは問題ない. イテレータが指している対象を変更不可能にしたければやはりconst_iteratorをそもそも使う必要があるということだ.
さらに言えば, 参照でなくとも"const std::vector