Ví dụ phổ biến cho các vòng lặp dựa trên phạm vi C ++ 11 luôn là một cái gì đó đơn giản như thế này:
std::vector<int> numbers = { 1, 2, 3, 4, 5, 6, 7 };
for ( auto xyz : numbers )
{
std::cout << xyz << std::endl;
}
Trong trường hợp đó xyz
là một int
. Nhưng, điều gì xảy ra khi chúng ta có một cái gì đó giống như bản đồ? Loại biến trong ví dụ này là gì:
std::map< foo, bar > testing = { /*...blah...*/ };
for ( auto abc : testing )
{
std::cout << abc << std::endl; // ? should this give a foo? a bar?
std::cout << abc->first << std::endl; // ? or is abc an iterator?
}
Khi container được duyệt là một cái gì đó đơn giản, có vẻ như các vòng lặp dựa trên phạm vi () sẽ cung cấp cho chúng ta từng mục, không phải là một trình vòng lặp. Thật tuyệt ... nếu đó là iterator, điều đầu tiên chúng ta luôn phải làm là loại bỏ nó.
Nhưng tôi bối rối không biết nên mong đợi điều gì khi nói đến những thứ như bản đồ và đa khung.
(Tôi vẫn đang sử dụng g ++ 4.4, trong khi các vòng dựa trên phạm vi nằm trong g ++ 4.6+, vì vậy tôi chưa có cơ hội dùng thử.)
std::begin
và cácstd::end
hàm hoặc hàm thành viên dưới cùng tên.