繁体   English   中英

C ++ for循环(C ++ 11方式和旧版本方式)

[英]c++ for loops(c++11 way and older versions way)

我刚刚开始学习c ++。 我被教导如何编写一个简单的for循环

例如

for (int i = 0; i < vector.size(); i++) {
    //do stuff
}

但是现在经常看到人们在他们的for循环中使用自动一词。

假设我有一个包含一些数据的向量,这些数据将被带到地图上

例如

以c ++ 11的方式

vector<char> vec;
map<char, int> myMap;
vec.push_back('a');
vec.push_back('b');
vec.push_back('b');
vec.push_back('c');

// Loop through the vector
for (auto x : vec) {
   ++myMap[x]; 
}

for (auto x : myMap) {

}

这等于

vector<char> vec;
map<char, int> myMap;
vec.push_back('a');
vec.push_back('b');
vec.push_back('b');
vec.push_back('c');

for (int x = 0; x < v.size(); x++) {
    ++myMap[v[x]];
}

for (int x = 0; x < myMap.size() x++) {
   //print content in map
}

它是等效的,而不是效率。 这是标准定义的确切翻译:

for (auto element : container) {
  //Stuff
}

转换为以下基于迭代器的循环:

auto&& __range = container; 
for (auto __itr = std::begin(container),  __end = std::end(container);
     __itr != __end; ++__itr) { 
   element = *__itr;
   //Stuff
}

尤其是,这不同之处在于,它仅计算一次结束(与多次调用v.size()相反),并且使用迭代器而不是索引。 它还提供了一个更简洁的界面:

  1. 您知道它必须遍历所有元素(除非您使用break / continue)。
  2. 您知道它必须一次循环一个元素(除非您使用break / continue)。
  3. 它隐藏了使用语法糖的索引/迭代器:)。

其他几件事:

1) auto是一项独立的语言功能。 您无需使用auto即可使用基于范围的for循环,例如:

for (int i : { 1, 2, 3, 4, 5}) {
   cout << i << endl;
}

是打印数字1-5的完全合法的方法。

2)与其使用push_back来填充示例矢量,不如使用“通用初始化”:

vector<char> vec { 'a', 'b', 'c', 'd' };

3)当对非原始类型使用基于范围的for循环时,更喜欢使用auto&const auto&作为范围声明类型。 例如

vector<string> v { "Hello", "world" };
for (const auto& elt : v) {
  cout << elt << endl;
}

之所以这样做,是因为复制除基元之外的内容通常很昂贵,并且默认情况下会进行复制。 在这里,我们取一个别名,为我们节省了一个字符串副本,因此节省了分配的性能成本。

资源

技术性:我提供的翻译有点不准确,因为它不能以与标准完全相同的方式处理所有情况(它更喜欢成员函数的begin / end和数组得到特殊处理)。 为了简化理解,我对其进行了简化。 有关更多详细信息,请参见上文。

您不能取消引用int变量。 您的旧样式示例需要稍作更新:

for (int x= 0 ; ( x < v.size() ) ; x ++ ) {
  ++ myMap[ v[x] ] ;
}

但是没有人在旧样式的C ++中真正做到这一点,他们使用了迭代器:

for ( vector<int>::iterator itptr= v.begin() ; ( itptr != v.end() ) ; ++ itptr ) {
  ++ myMap[ * itptr ] ;
}

由于auto这种形式的for循环在C ++ 11中变得更容易:

for ( auto itptr= v.begin() ; ( itptr != v.end() ) ; ++ itptr ) {
  ++ myMap[ * itptr ] ;
}

但是正如您所看到的,新的for表单是最简单的:

// Loop through the vector
for (auto x : vec) {
 ++myMap[x]; 
}

但请注意,我没有取消引用xx是字符。

是的 ,它们是等效的。

除了在这两种情况下,你应该试图尊重x ,因为在这两种情况下,这是一个语法错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM