我是C++语言的新手.我已经开始使用向量,并且已经注意到在我看到的所有代码中通过索引迭代通过向量,for循环的第一个参数总是基于向量.在Java中,我可以使用ArrayList执行类似的操作:
for(int i=0; i < vector.size(); i++){
vector[i].doSomething();
}
Run Code Online (Sandbox Code Playgroud)
有没有理由我在C++中没有看到这个?这是不好的做法吗?
查看n3092,在§6.5.4中,我们找到了基于范围的for循环的等价性.然后它继续说什么__begin和__end等于.它区分了数组和其他类型,我觉得这是多余的(也就是令人困惑).
它表示数组类型__begin和__end你所期望的:指向第一个的指针和指向一个结尾的指针.那么对于其他类型的,__begin并__end等于begin(__range)和end(__range),与ADL.命名空间std是关联的,以便在第24.6.5节中找到std::begin并std::end定义<iterator>.
但是,如果我们看的定义std::begin和std::end,他们是阵列以及容器类型都定义.并且数组版本与上面完全相同:指向第一个的指针,指向一个结尾的指针.
为什么需要将数组与其他类型区分开来,当为其他类型提供的定义同样适用时,查找std::begin和std::end?
为方便起见,有些删节报价:
§6.5.4基于范围的
for陈述- 如果_RangeT是一个数组类型,则begin-expr和end-expr分别是__range和__range + __bound,其中__bound是数组绑定的.如果_RangeT是未知大小的数组或不完整类型的数组,则程序格式错误.
- 否则,begin-expr和end-expr分别是begin(__ range)和end(__ range),其中begin和end通过参数依赖查找(3.4.2)查找.出于此名称查找的目的,名称空间std是关联的名称空间.
§24.6.5范围访问
Run Code Online (Sandbox Code Playgroud)template <class T, size_t N> T* begin(T (&array)[N]);返回:数组.
Run Code Online (Sandbox Code Playgroud)template <class T, size_t N> T* end(T (&array)[N]);返回:数组+ N.
以下内容无法编译:
#include <iostream>
int main()
{
int a{},b{},c{},d{};
for (auto& s : {a, b, c, d}) {
s = 1;
}
std::cout << a << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译器错误是: error: assignment of read-only reference 's'
现在,在我的实际情况中,列表由类中的成员变量组成。
现在,这不起作用,因为表达式变为initializer_list<int>实际上复制a,b,c和d的a,因此也不允许修改。
我的问题有两个:
不允许以这种方式编写基于范围的for循环背后有动机吗? 例如。也许会有一些特殊的情况来表达裸括号。
修复此类循环的语法整洁方法是什么?
最好遵循以下方式:
for (auto& s : something(a, b, c, d)) {
s = 1;
}
Run Code Online (Sandbox Code Playgroud)
我认为指针间接寻址不是一个好的解决方案(即{&a, &b, &c, &d})-在取消迭代器时,任何解决方案都应直接给元素提供引用。
for当我弄清楚它是如何工作的时候,我正在阅读关于"范围"的陈述.
下面是一个将字符串转换为大写的程序.
string s("Hello World!!!");
//convert s to uppercase
for( auto &c :s ) // for every char in s
c= topper(c); // c is a reference,so the assignment changes the
// char in s
cout<< s << endl;
Run Code Online (Sandbox Code Playgroud)
对字符串的引用(即,c)是如何将元素更改为upppercase的?
我已经搜索了迭代如何在这里工作,但我找不到答案.
在标题中,是否有任何类型的"foreach"等效于数组,或者它只适用于向量?我已经问了一位计算机科学教授,他只回答了更复杂的结构,我们在课程中看不到这些结构.
我有一个指针"a",它是A*类型.我现在在该地址有n个类型为A的对象,我想迭代它们.
我想把它转换为A [n],这样我就可以使用c ++ 11范围来编写for (auto temp : a){...}.当然,我可以使用经典for(int i=0; i<n; i++) {temp=a[i]; ...}但范围更清洁.