range-based for in c++11(c++11中基于范围的for)
问题描述
在 C++ 11 中,如果我们有一个 set;我们可以说:
in c++ 11 if we have a set<int> S; we could say:
for (auto i: S)
cout << i << endl;
但是我们可以强制 i 成为迭代器吗,我的意思是写一段代码,相当于:
but can we force i to be a iterator, I mean write a code that is equivalent to:
for (auto i = S.begin(); i != S.end(); i++)
cout << (i != s.begin()) ? " " : "" << *i;
或者我们可以做一些我们可以理解i在集合(或向量)中的索引的事情吗?
or could we do something that we can understand the index of i in the set(or vector)?
另一个问题是我们怎么能说不对 S 中的所有元素都这样做,而是对它们的前半部分或除第一个之外的所有元素都这样做.
and another question is how could we say that don't do this for all elements in S but for first half of them or all of them except the first one.
或者当我们有一个 vector,想打印它的第一个n值怎么办?我知道我们可以创建一个新的向量,但是将一个向量复制到一个新的向量需要时间.
or when we have a vector<int> V, and want to print its first n values what should we do? I know we can create a new vector but it takes time to copy a vector to a new vector.
推荐答案
没有,很不幸.看看标准怎么说:
No, unluckily. See what the standard says:
基于范围的for语句for ( for-range-declaration : expression ) 语句相当于
The range-based for statement for ( for-range-declaration : expression ) statement is equivalent to
{
auto && __range = ( expression );
for ( auto __begin = begin-expr, __end = end-expr; __begin != __end; ++__begin ) {
for-range-declaration = *__begin;
statement
}
}
其中 __range、__begin 和 __end 是仅为说明而定义的变量
where __range, __begin, and __end are variables defined for exposition only
换句话说,它已经从 begin 迭代到 end 并且已经解引用了迭代器,这是你永远看不到的.
In other words, it already iterates from begin to end and already dereferences the iterator, which you never get to see.
这篇关于c++11中基于范围的for的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:c++11中基于范围的for
基础教程推荐
- 非静态 const 成员,不能使用默认赋值运算符 2022-10-09
- GDB 显示调用堆栈上函数地址的当前编译二进制文 2022-09-05
- 为什么 typeid.name() 使用 GCC 返回奇怪的字符以及如 2022-09-16
- CString 到 char* 2021-01-01
- 如果我为无符号变量分配负值会发生什么? 2022-01-01
- 为什么 RegOpenKeyEx() 在 Vista 64 位上返回错误代码 2021-01-01
- 为什么派生模板类不能访问基模板类的标识符? 2021-01-01
- 我应该对 C++ 中的成员变量和函数参数使用相同的名称吗? 2021-01-01
- 初始化列表*参数*评估顺序 2021-01-01
- 通过引用传递 C++ 迭代器有什么问题? 2022-01-01
