Подтвердить что ты не робот

Используйте ключевое слово auto в С++ STL

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

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?

4b9b3361

Ответ 1

Ключевое слово auto просто просит компилятор вывести тип переменной из инициализации.

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

Ответ 2

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

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

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

вместо

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

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

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

Ответ 3

Ключевое слово 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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

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