67

const_iterator最初の質問: auto を使用して「強制」することは可能ですか? 例えば:

map<int> usa;
//...init usa
auto city_it = usa.find("New York");

が指すものを変更するのではなく、クエリを実行したいだけcity_itなのでcity_itmap<int>::const_iterator. しかし、auto を使用すると、city_itは の戻り値の型と同じになりmap::find()ますmap<int>::iterator。なにか提案を?

4

8 に答える 8

40

申し訳ありませんが、(暗黙的に有効な)型変換を実行したいので、最善の提案はまったく使用しないことだと思います。正確なタイプを推測するためのものですが、ここでは必要ありません。autoauto

このように書くだけです:

std::map<std::string, int>::const_iterator city_it = usa.find("New York");

MooingDuckが正しく指摘しているように、型エイリアスを使用すると、コードの可読性と保守性を向上させることができます。

typedef std::map<std::string, int> my_map;
my_map::const_iterator city_it = usa.find("New York");
于 2013-03-05T20:20:25.800 に答える
13

きれいな解決策は、それ以外の場合は変更可能なマップへのconst参照を使用することです。

const auto &const_usa = usa;
auto city_it = const_usa.find("New York");

これにより、 を変更できないことが保証const_usaされ、const イテレータが使用されます。

于 2016-03-14T09:45:58.493 に答える
12

これは、@ Jollymorphicの回答と比較して、への変換に関する大幅な違いはありませんが、const次のようなユーティリティワンライナー関数があると便利だと思います:

template<class T> T const& constant(T& v){ return v; }

これにより、変換がより魅力的になります。

auto it = constant(usa).find("New York");
// other solutions for direct lengths comparision
std::map<std::string, int>::const_iterator city_it = usa.find("New York");
auto city_it = const_cast<const std::map<std::string, int>&>(usa).find("New York");

そうですね、大きければ大きいほど良いとは限りません。もちろん、好みに応じて関数の名前を選択することもできます-as_constまたはconst_、可能な代替手段です。

于 2013-03-05T21:07:12.127 に答える
6

auto を使用した別のバリエーション (変更可能な usa と const usa の両方を保持):

map<std::string, int> usa;
//...init usa
const auto &const_usa = usa;
auto city_it = const_usa.find("New York");

init 後にマップを変更可能にする必要がまったくない場合は、他のオプションがいくつかあります。

usa を const として定義し、関数呼び出しで初期化できます。

const map<std::string, int> usa = init_usa();
auto city_it = usa.find("New York");

または、ラムダを使用して const マップを初期化します。

const auto usa = [&]()->const map<std::string, int> 
   {
   map<std::string, int> usa;
   //...init usa
   return usa;
   }();
auto city_it = usa.find("New York");
于 2013-03-12T16:57:36.867 に答える
1

私は今これをテストする立場にありませんが、うまくいくと思います:

auto city_it = const_cast< const map<int> & >(usa).find("New York");
于 2013-03-05T20:15:45.717 に答える
-3

auto を使用して、型を「追跡」したり、型を「推定」したりできます。 // deduce auto city_it = usa.find("New York");

// track auto city_it = std::map<int>::const_iterator( usa.find("New York"));

また、Herb Sutter による最新の C++ スタイルのトークもご覧ください。これらの型推論ガイダンスのほとんどがカバーされています。 https://youtu.be/xnqTKD8uD64

于 2015-09-11T01:33:57.557 に答える