2

入力するよりもコンテナのイテレータの型名を参照する効率的な方法はありますか

std::unordered_map<keyclass, valueclass>::iterator 

イテレータが必要になるたびに?

もちろん、あります

typedef boost::unordered_map<keyclass, valueclass>::iterator classitr

しかし、すべてのコンテナに typedef を導入しても、非常に読みやすいコードとは思えません。C++ の初心者であり、通常、使用したいコンテナーへの参照があると仮定すると、次の行に沿って何かがありますか?

Container<KeyClass, ValueClass> x;

x::iterator_type i

または私が見逃している他の明らかなショートカットはありますか?

4

2 に答える 2

3

autoこれが、C++11 がキーワードの新しい意味を導入した理由の 1 つです。

auto it = vec.begin();

コンパイラはit、テンプレートの型推定と同様の方法で、イニシャライザから の型を計算します。

C++ 11より前の通常のアプローチはtypedef、あなたが提案したように s を使用することでした。typedef多くの場合、コンテナにとって最も便利であり、それに関連するすべてのものを提供します。

typedef std::unordered_map<key, value> map;
map m;
map::iterator = m.begin();

より意味のある名前を付けて、それがtypedefどのようなものかを正確に説明することができますmap。たとえば、名前から電話番号へのマップがある場合、それを呼び出すことができphone_map、イテレータは になりますphone_map::iterator

auto完璧な転送のための便利なツールでもあります

于 2013-02-07T11:54:02.407 に答える
2

C++11 ではdecltype、変数から型を取得するために使用できます。

書く:

std::unordered_map<keyclass, valueclass> m;
decltype(m)::iterator it = m.begin();

もちろん、C++1 を使用している場合は、次のように書くこともできます。

std::unordered_map<keyclass, valueclass> m;
auto it = m.begin();
于 2013-02-07T11:55:36.310 に答える