1. ホーム
  2. c++

[解決済み】cbegin/cendの理由は何ですか?

2022-04-12 02:17:22

質問

なぜだろう? cbegincend はC++11で導入されたのですか?

の const オーバーロードと異なるのは、どのような場合ですか? beginend ?

解決方法は?

それはとても簡単なことです。ベクトルがあるとします。

std::vector<int> vec;

この中にいくつかのデータを入れます。そして、いくつかのイテレータをそれに接続したいと思います。もしかしたら、それを渡すかもしれない。もしかしたら std::for_each :

std::for_each(vec.begin(), vec.end(), SomeFunctor());

C++03の場合。 SomeFunctor が自由にできるようになりました。 モディファイ を取得します。もちろん SomeFunctor は、パラメータを値で受け取るか const& を使用する方法はありません。 確保 ということです。このような愚かなことをしない限りはね。

const std::vector<int> &vec_ref = vec;
std::for_each(vec_ref.begin(), vec_ref.end(), SomeFunctor());

では、次に cbegin/cend :

std::for_each(vec.cbegin(), vec.cend(), SomeFunctor());

という構文的な保証が得られました。 SomeFunctor はベクトルの要素を変更することはできません (もちろん const キャストは不要です)。我々は明示的に const_iterator であり、したがって SomeFunctor::operator() が呼び出されます。 const int & . もし、パラメータを int & C++はコンパイラーエラーを出します。


C++17には、この問題に対してよりエレガントな解決策があります。 std::as_const . まあ、少なくとも、範囲ベースの for :

for(auto &item : std::as_const(vec))

これは単に const& を、それが提供されるオブジェクトに変換します。