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

C++ 在C+中使用auto关键字+;STL,c++,stl,c++11,C++,Stl,C++11,我见过使用向量的代码 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; } 向量; s、 推回(11); s、 推回(22); s、 推回(33); s、 推

我见过使用向量的代码

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;
}
向量;
s、 推回(11);
s、 推回(22);
s、 推回(33);
s、 推回(55);
for(vector::iterator it=s.begin();it!=s.end();it++){

coutauto关键字从=”右侧的表达式中获取类型。因此,它可以用于任何类型,唯一的要求是在声明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
auto a=0.0f;//a是浮点型
auto b=std::vector();//b是std::vector()
MyType foo(){return MyType();}
auto c=foo();//c是MyType

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

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
#包括
#包括
使用名称空间std;
int main()
{
载体;
s、 推回(11);
s、 推回(22);
s、 推回(33);
s、 推回(55);
for(int it=s.begin();it!=s.end();it++){
cout这是附加信息,不是答案

在C++11中,您可以编写:

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

cout这是语言中的一个新项目,我认为我们将在未来几年中努力解决。开始的“自动”不仅会带来可读性问题,从现在开始,当你遇到它时,你将不得不花费大量时间试图弄清楚它是什么(就像实习生将所有变量命名为xyz:)),但你也会花相当多的时间清理那些容易激动的程序员,就像在我之前回答的那个人一样。 从上面的例子,我可以打赌1000美元,将被写入 “for(auto-it:s)”,而不是“for(auto&it:s)”,因此,在您列出所需的位置调用移动语义,修改下面的集合


问题的另一个例子是你的问题本身。你显然对stl迭代器不太了解,你试图通过使用“自动”的魔力来克服这一差距,因此,如果你想要一个所有程序员(c++、java和其他)都能读的代码,那么你创建的代码以后可能会有问题使用原始的旧表单,而不是新功能

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

虽然在技术上是正确的。但我希望这会成为一种不好的做法。如果每个人都只声明他们所有的变量
auto
,那么人类将很难阅读和理解(并且我们将走向非类型化语言)。auto的使用应该保留在我们不关心类型的情况下,只要它在我们想要的庄园中运行(例如迭代器,我们不关心我们得到什么迭代器,只要我们可以像迭代器一样使用它)。@Martin:不是开玩笑,我第一次看到一块
auto
变量时,我就认为就像你说的,它应该用在那种“给我一个变量,不管它是什么类型”的情况下,而不是“声明一个变量,然后从它的初始值来推断它的类型,呵呵!"斯维克鲁:不,我的意思是人类很难阅读。c的类型是什么?我需要知道吗。它如何影响我对其余代码的解释。@LokiAstari:如果有一个像样的IDE,当你悬停在“自动”上时,它可以告诉你类型,这个问题就完全消除了。它不是非类型化的,而是静态的打字不准确,带有(非常简单)推理。事实上,它似乎已成为标准,最好在大多数情况下使用auto。对于STL工作,auto已经在我身上得到了发展。例如,当您想要测试STL函数的返回值,并且该返回值是一对或一些模糊的值时,它非常有用。有人知道GCC上的编译器标志需要启用对auto的支持吗?这些是不等价的-在第一种情况下,变量
it
的类型是
value\u类型
,实际上并不是迭代器。在这种情况下,我会用
“\n”
替换
std::endl
,以防止刷新操作。或者
'\n'
这样你就不需要浪费
strlen迭代器在那里已经存在了20多年,而 Auto <代码>已经8年了:(同样),基于C++的循环与java for for循环非常相似,因此使用这种构造,java开发者的可读性实际上得到了提高。
for (auto it = s.begin(); it != s.end(); it++) {
    cout << *it << endl;
}
atp::ta::DataDrawArrayInfo* ddai;
for(size_t i = 0; i < m_dataDraw->m_dataDrawArrayInfoList.size(); i++) {
    ddai = m_dataDraw->m_dataDrawArrayInfoList[i];
    //...
}