Используйте ключевое слово auto в C ++ STL - PullRequest
33 голосов
/ 08 августа 2010

Я видел код, который использует вектор,

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

Ответы [ 6 ]

45 голосов
/ 08 августа 2010

Ключевое слово 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 просто позволяет воспользоваться этими знаниями - если вы (компилятор) знаете правильный тип, просто выберите для меня!

32 голосов
/ 19 июня 2014

Это дополнительная информация, а не ответ.

В C ++ 11 вы можете написать:

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

вместо

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

Имеет то же значение.

Обновление : См. Также комментарий @ Alnitak.

13 голосов
/ 08 августа 2010

Ключевое слово 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
3 голосов
/ 08 августа 2010
Ключевое слово

auto предназначено для использования в такой ситуации, оно абсолютно безопасно. Но, к сожалению, он доступен только в C ++ 0x, поэтому у вас будут проблемы с переносимостью.

2 голосов
/ 15 сентября 2015

Это новый пункт в языке, с которым, я думаю, мы будем бороться в течение многих лет.«Авто» запуска представляет не только проблему читабельности, с этого момента, когда вы столкнетесь с ним, вам придется тратить значительное время, пытаясь выяснить, что это такое (точно так же, как время, когда стажер назвал все переменные xyz :)), ноВы также потратите немало времени на уборку после легко возбудимых программистов, как тот, кто отвечал до меня.В примере, приведенном выше, я могу поспорить, что $ 1000 будет написано «для (auto it: s)», а не «для (auto & it: s)», в результате вызывая семантику перемещения там, где вы ее ожидаете, изменяя свою коллекцию внизу.

Другим примером проблемы является сам ваш вопрос.Вы явно не очень много знаете об итераторах stl и пытаетесь преодолеть этот пробел, используя магию 'auto', в результате вы создаете код, который может быть проблематичным позже

0 голосов
/ 04 апреля 2019

Если вы хотите, чтобы код, читаемый всеми программистами (c ++, java и др.), Использовал новую старую форму вместо новых криптографических функций

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...