โดยทั่วไปแล้วตัววนซ้ำจะใช้เพื่อเข้าถึงองค์ประกอบของคอนเทนเนอร์ในรูปแบบเชิงเส้น แต่การที่มี "iterators เข้าถึงโดยสุ่ม" ก็เป็นไปได้ในการเข้าถึงองค์ประกอบใด ๆ operator[]
ในแบบเดียวกับ
ในการเข้าถึงองค์ประกอบตามอำเภอใจในเวกเตอร์ vec
คุณสามารถใช้สิ่งต่อไปนี้:
vec.begin() // 1st
vec.begin()+1 // 2nd
// ...
vec.begin()+(i-1) // ith
// ...
vec.begin()+(vec.size()-1) // last
ต่อไปนี้เป็นตัวอย่างของรูปแบบการเข้าถึงทั่วไป (C ++ เวอร์ชันก่อนหน้า):
int sum = 0;
using Iter = std::vector<int>::const_iterator;
for (Iter it = vec.begin(); it!=vec.end(); ++it) {
sum += *it;
}
ข้อดีของการใช้ iterator คือคุณสามารถใช้รูปแบบเดียวกันกับคอนเทนเนอร์อื่น ๆ :
sum = 0;
for (Iter it = lst.begin(); it!=lst.end(); ++it) {
sum += *it;
}
ด้วยเหตุนี้จึงเป็นเรื่องง่ายมากที่จะสร้างแม่แบบรหัสที่จะทำงานเดียวกันคำนึงถึงประเภทของภาชนะ ข้อดีอีกอย่างของการวนซ้ำคือไม่ถือว่าข้อมูลนั้นอยู่ในหน่วยความจำ ตัวอย่างเช่นเราสามารถสร้างตัววนไปข้างหน้าซึ่งสามารถอ่านข้อมูลจากอินพุตสตรีมหรือสร้างข้อมูลได้ทันที (เช่นช่วงหรือตัวสร้างตัวเลขสุ่ม)
อีกทางเลือกหนึ่งที่ใช้std::for_each
และ lambdas:
sum = 0;
std::for_each(vec.begin(), vec.end(), [&sum](int i) { sum += i; });
เนื่องจาก C ++ 11 คุณสามารถใช้auto
เพื่อหลีกเลี่ยงการระบุชื่อประเภทที่ยาวและซับซ้อนของตัววนซ้ำอย่างที่เคยเห็นมาก่อน (หรือซับซ้อนกว่านั้น):
sum = 0;
for (auto it = vec.begin(); it!=vec.end(); ++it) {
sum += *it;
}
และนอกจากนี้ยังมีตัวแปรที่ง่ายกว่าสำหรับแต่ละตัวแปร:
sum = 0;
for (auto value : vec) {
sum += value;
}
และสุดท้ายยังมีstd::accumulate
จุดที่คุณต้องระวังไม่ว่าคุณจะเพิ่มจำนวนเต็มหรือตัวเลขทศนิยม