Tipik olarak yineleyiciler, bir kabın öğelerine doğrusal biçimde erişmek için kullanılır; ancak "rastgele erişim yineleyiciler" ile herhangi bir öğeye aynı şekilde erişmek mümkündür operator[]
.
To bir vektör erişim keyfi elemanları vec
, aşağıdakileri kullanabilirsiniz:
vec.begin() // 1st
vec.begin()+1 // 2nd
// ...
vec.begin()+(i-1) // ith
// ...
vec.begin()+(vec.size()-1) // last
Aşağıda, tipik bir erişim modelinin bir örneği verilmiştir (C ++ 'ın önceki sürümleri):
int sum = 0;
using Iter = std::vector<int>::const_iterator;
for (Iter it = vec.begin(); it!=vec.end(); ++it) {
sum += *it;
}
Yineleyici kullanmanın avantajı, aynı kalıbı diğer kaplarla uygulayabilmenizdir :
sum = 0;
for (Iter it = lst.begin(); it!=lst.end(); ++it) {
sum += *it;
}
Bu nedenle, konteyner türü ne olursa olsun aynı şekilde çalışacak şablon kodu oluşturmak gerçekten çok kolay . Yineleyicilerin diğer bir avantajı, verilerin bellekte yerleşik olduğunu varsaymamasıdır; örneğin, bir girdi akışından veri okuyabilen veya anında veri üreten bir ileri yineleyici yaratılabilir (örneğin, bir aralık veya rasgele sayı üreteci).
std::for_each
Lambdas kullanan başka bir seçenek :
sum = 0;
std::for_each(vec.begin(), vec.end(), [&sum](int i) { sum += i; });
C ++ 11'den auto
beri, daha önce görüldüğü gibi (veya daha karmaşık) yineleyicinin çok uzun, karmaşık bir tür adını belirtmekten kaçınmak için kullanabilirsiniz :
sum = 0;
for (auto it = vec.begin(); it!=vec.end(); ++it) {
sum += *it;
}
Ayrıca, her varyant için daha basit bir yöntem vardır:
sum = 0;
for (auto value : vec) {
sum += value;
}
Ve son olarak, std::accumulate
tamsayı veya kayan nokta sayıları eklerken dikkatli olmanız gereken yerler de vardır .