ใช้ชุดตัวเลือกที่อธิบายสิ่งที่คุณตั้งใจจะทำดีที่สุด นั่นคือ
สำหรับแต่ละองค์ประกอบx
ในการทำvec
bar.process(x)
ตอนนี้เรามาตรวจสอบตัวอย่าง:
std::for_each(vec.begin(), vec.end(),
std::bind1st(std::mem_fun_ref(&Bar::process), bar));
เรามีfor_each
มีมากเกินไป - yippeh เรามี[begin; end)
ช่วงที่เราต้องการดำเนินการ
โดยหลักการแล้วอัลกอริทึมนั้นชัดเจนกว่าและชอบมากกว่าการเขียนด้วยมือใด ๆ แต่แล้ว ... ยึดประสาน? Memfun? โดยทั่วไป C ++ interna ของวิธีการรับฟังก์ชั่นสมาชิก? สำหรับงานของฉันฉันไม่สนใจพวกเขา! ฉันไม่ต้องการที่จะทุกข์ทรมานจาก verbose ไวยากรณ์น่าขนลุกนี้
ตอนนี้ความเป็นไปได้อื่น ๆ :
for (std::vector<Foo>::const_iterator it = vec.begin(); it != vec.end(); ++it)
{
bar.process(*it);
}
จริงอยู่นี่เป็นรูปแบบทั่วไปที่จะจดจำ แต่ ... สร้างตัววนซ้ำวนซ้ำเพิ่มขึ้น dereferencing นี่คือทุกสิ่งที่ฉันไม่สนใจเพื่อให้งานของฉันเสร็จ
ยอมรับมันดู waay ดีกว่าวิธีแรก (อย่างน้อยห่วงร่างกายมีความยืดหยุ่นและค่อนข้างชัดเจน) แต่ยังคงมันไม่ได้จริงๆที่ดี เราจะใช้อันนี้ถ้าเราไม่มีความเป็นไปได้ที่ดีขึ้น แต่บางทีเราอาจมี ...
วิธีที่ดีกว่า
for_each
ตอนนี้กลับไป จะดีหรือไม่ถ้าพูดอย่างแท้จริงfor_each
และมีความยืดหยุ่นในการทำงานที่ต้องทำด้วย? โชคดีที่ตั้งแต่ C ++ 0x lambdas เราเป็น
for_each(v.begin(), v.end(), [&](const Foo& x) { bar.process(x); })
ตอนนี้เราได้ค้นพบวิธีแก้ปัญหาทั่วไปที่เป็นนามธรรมในหลาย ๆ สถานการณ์ที่เกี่ยวข้องแล้วในกรณีนี้เรามีรายการโปรด # 1 ที่แน่นอน:
foreach(const Foo& x, vec) bar.process(x);
มันไม่ได้ชัดเจนกว่านั้นจริงๆ โชคดีที่ C ++ 0x มีไวยากรณ์ในตัวที่คล้ายกัน!
map(bar.process, vec)
แม้ว่าแผนที่สำหรับผลข้างเคียงจะหมดกำลังใจและแนะนำให้ใช้รายการความเข้าใจ / ตัวสร้างนิพจน์บนแผนที่)