在C ++ STL中使用auto关键字

时间:2010-08-08 12:15:28

标签: c++ stl c++11

我见过使用vector的代码,

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 个答案:

答案 0 :(得分:44)

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

自动关键字只是让您利用这些知识 - 如果您(编译器)知道正确的类型,请选择我!

答案 1 :(得分:29)

它的其他信息,并不是答案。

在C ++ 11中,你可以写:

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

而不是

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

它具有相同的含义。

更新也请参阅@ Alnitak的评论。

答案 2 :(得分:12)

auto关键字从=右侧的表达式中获取类型。因此它适用于任何类型,唯一的要求是在声明时初始化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 :(得分:3)

auto关键字旨在用于这种情况,绝对安全。但遗憾的是,它仅在C ++ 0x中可用,因此您将遇到可移植性问题。

答案 4 :(得分:2)

这是我认为我们将在未来几年内努力奋斗的语言中的新项目。 &#39; auto&#39;一开始就提出了可读性问题,从现在开始,当你遇到它时,你将不得不花费大量时间试图找出wtf(就像实习生命名所有变量的时间xyz :)),但你也将花费经过相当多的时间清理后,容易兴奋的程序员,就像曾经在我之前回复的人一样。 从上面的例子,我可以打1000美元,将被写入 &#34; for(auto it:s)&#34 ;, not&#34; for(auto&amp; it:s)&#34 ;,结果调用移动语义,列出期望它,修改你的集合下面。

问题的另一个例子是你的问题本身。你显然不太了解stl迭代器,你试图通过使用&#39; auto&#39;来克服这个差距,因此你创建的代码可能会在以后出现问题

答案 5 :(得分:0)

如果您希望所有程序员(c ++,java和其他程序)都可读的代码,请使用原始的旧格式而不是加密的新功能

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