[英]Is there any way to implement Initializer lists (kind of) in older version of c++ (Before 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) 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];
}
但请注意,我没有取消引用x
, x
是字符。
是的 ,它们是等效的。
除了在这两种情况下,你不应该试图尊重x
,因为在这两种情况下,这是一个语法错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.