問題描述
在 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的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!