web-dev-qa-db-ja.com

C ++ STLでautoキーワードを使用します

ベクトルを使用するコードを見てきましたが、

vector<int>s;
s.Push_back(11);
s.Push_back(22);
s.Push_back(33);
s.Push_back(55);
for (vector<int>::iterator it = s.begin(); it!=s.end(); it++) {
    cout << *it << endl;
}

と同じです

for (auto it = s.begin(); it != s.end(); it++) {
    cout << *it << endl;
}

この場合、autoキーワードの使用は安全ですか?そして、ベクターのタイプがfloatである場合はどうでしょうか? string

34

autoキーワードは、初期化から変数の型を推測するようコンパイラーに単純に要求します。

C++ 0x以前のコンパイラでさえ、(初期化)式の型が何であるかを知っていて、多くの場合、エラーメッセージでその型を見ることができます。

#include <vector>
#include <iostream>
using namespace std;

int main()
{
    vector<int>s;
    s.Push_back(11);
    s.Push_back(22);
    s.Push_back(33);
    s.Push_back(55);
    for (int it=s.begin();it!=s.end();it++){
        cout<<*it<<endl;
    }
}

Line 12: error: cannot convert '__gnu_debug::_Safe_iterator<__gnu_cxx::__normal_iterator<int*, __gnu_norm::vector<int, std::allocator<int> > >, __gnu_debug_def::vector<int, std::allocator<int> > >' to 'int' in initialization

autoキーワードを使用すると、この知識を簡単に活用できます。適切な型を(コンパイラー)が知っている場合は、私のために選択してください。

44
UncleBens

これは追加情報であり、回答ではありません。

C++ 11では、次のように記述できます。

for (auto& it : s) {
    cout << it << endl;
}

の代わりに

for (auto it = s.begin(); it != s.end(); it++) {
    cout << *it << endl;
}

同じ意味です。

更新@ Alnitakのコメントも参照してください。

37
user1234567

Autoキーワードは、=の右側の式からタイプを取得します。したがって、どの型でも機能します。唯一の要件は、コンパイラが型を推測できるように、宣言時に自動変数を初期化することです。

例:

auto a = 0.0f;  // a is float
auto b = std::vector<int>();  // b is std::vector<int>()

MyType foo()  { return MyType(); }

auto c = foo();  // c is MyType
13
Karel Petranek

autoキーワードは、このような状況で使用することを目的としており、絶対に安全です。ただし、残念ながらC++ 0xでのみ使用できるため、移植性の問題が発生します。

これは言語の新しい項目であり、今後数年間苦労することになると思います。開始の「自動」は読みやすさの問題を提示するだけでなく、これに遭遇すると、wtfの把握にかなりの時間を費やす必要があります(インターンがすべての変数xyzに名前を付けたときと同じように:))、また、私の前に返事をしたような、簡単に興奮できるプログラマーの後の掃除にもかなりの時間を費やすでしょう。上記の例では、$ 1000を賭けることができ、「for(auto&it:s)」ではなく「for(auto it:s)」と記述されます。

問題の別の例は、質問そのものです。あなたは明らかにstlイテレータについてあまり知らないので、「auto」の魔法を使用してそのギャップを克服しようとしているので、後で問題になる可能性のあるコードを作成します

2
a o

すべてのプログラマー(c ++、Javaなど)が読み取り可能なコードが必要な場合は、暗号化の新機能の代わりに元の古い形式を使用します

atp::ta::DataDrawArrayInfo* ddai;
for(size_t i = 0; i < m_dataDraw->m_dataDrawArrayInfoList.size(); i++) {
    ddai = m_dataDraw->m_dataDrawArrayInfoList[i];
    //...
}
0
user11310689