c++ 中基于范围的 for 循环的替代方法
Alternative to range-based for loops in c++
对于向量数组,除了基于范围的 for 循环之外,还有其他选择吗?我注意到 c++98 不允许基于范围的 for 循环。下面是一些使用基于范围的 for 循环遍历向量数组的示例代码:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> vecArray1 (3,20);
for (int v: vecArray1) {
cout << "ArrayValue:" << v << endl;
}
return 0;
}
下面是我试过但行不通的替代方法:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> vecArray1 (3,20);
for (int i=0; i<sizeof(vecArray1); ++i) {
cout << "ArrayValue:" << vecArray1[i] << endl;
}
return 0;
}
它输出 10 个元素,而不是上面向量数组定义的 3 个元素。对于基于范围的 for 循环,是否有适用于 c++98 的替代方案?
sizeof(vecArray1)
并不像你想的那样。
要么使用:
for (int i=0; i<vecArray1.size(); ++i) {
cout << "ArrayValue:" << vecArray1[i] << endl;
}
或:
for (std::vector<int>::iterator it = vecArray1.begin(); it != vecArray1.end(); it++) {
cout << "ArrayValue: " << *it << endl;
}
第二个更冗长,但也适用于其他类型的集合(如 std::list
),并且更类似于基于范围的 for 循环的作用。
C++98 不允许基于范围的 for 循环。
在 C++98 中,您需要执行以下操作:
for(unsigned int i=0;i<vecArray.size();++i)
std::cout << "ArrayValue: " << vecArray[i] << std::endl;
或
for(std::vector<int>::iterator it=vecArray.begin();it!=vecArray.end();++it)
std::cout << "ArrayValue: " << *it << std::endl;
运营商
sizeof
不会给你数组的长度。相反,它 returns 一个无符号整数,表示您作为参数给出的类型的字节数。
例如,
std::cout << sizeof(unsigned long long) << std::endl;
打印
8
在我的机器上,因为类型 unsigned long long 由 64 位组成,或 64/8 = 8 字节。
在 C++11 中,我们现在有基于范围的 for 循环:
示例:
for(int i : vecArray)
std::cout << "i = " << i << std::endl;
for(const int& i : vecArray)
std::cout << "i = " << i << std::endl;
在第一个示例中,值从 vecArray 复制到变量 i 中。在第二个示例中,您改为使用对 vecArray 中的值的 const 引用(这对于复制成本很高的对象可能很有用)。
事实上,C++11 中基于范围的 for 循环可用于您可以调用 begin() 和 end() 的所有类型(即您可以迭代的类型)。
对于向量数组,除了基于范围的 for 循环之外,还有其他选择吗?我注意到 c++98 不允许基于范围的 for 循环。下面是一些使用基于范围的 for 循环遍历向量数组的示例代码:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> vecArray1 (3,20);
for (int v: vecArray1) {
cout << "ArrayValue:" << v << endl;
}
return 0;
}
下面是我试过但行不通的替代方法:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> vecArray1 (3,20);
for (int i=0; i<sizeof(vecArray1); ++i) {
cout << "ArrayValue:" << vecArray1[i] << endl;
}
return 0;
}
它输出 10 个元素,而不是上面向量数组定义的 3 个元素。对于基于范围的 for 循环,是否有适用于 c++98 的替代方案?
sizeof(vecArray1)
并不像你想的那样。
要么使用:
for (int i=0; i<vecArray1.size(); ++i) {
cout << "ArrayValue:" << vecArray1[i] << endl;
}
或:
for (std::vector<int>::iterator it = vecArray1.begin(); it != vecArray1.end(); it++) {
cout << "ArrayValue: " << *it << endl;
}
第二个更冗长,但也适用于其他类型的集合(如 std::list
),并且更类似于基于范围的 for 循环的作用。
C++98 不允许基于范围的 for 循环。 在 C++98 中,您需要执行以下操作:
for(unsigned int i=0;i<vecArray.size();++i)
std::cout << "ArrayValue: " << vecArray[i] << std::endl;
或
for(std::vector<int>::iterator it=vecArray.begin();it!=vecArray.end();++it)
std::cout << "ArrayValue: " << *it << std::endl;
运营商
sizeof
不会给你数组的长度。相反,它 returns 一个无符号整数,表示您作为参数给出的类型的字节数。 例如,
std::cout << sizeof(unsigned long long) << std::endl;
打印
8
在我的机器上,因为类型 unsigned long long 由 64 位组成,或 64/8 = 8 字节。
在 C++11 中,我们现在有基于范围的 for 循环:
示例:
for(int i : vecArray)
std::cout << "i = " << i << std::endl;
for(const int& i : vecArray)
std::cout << "i = " << i << std::endl;
在第一个示例中,值从 vecArray 复制到变量 i 中。在第二个示例中,您改为使用对 vecArray 中的值的 const 引用(这对于复制成本很高的对象可能很有用)。
事实上,C++11 中基于范围的 for 循环可用于您可以调用 begin() 和 end() 的所有类型(即您可以迭代的类型)。