เพื่อตอบคำถามของคุณคุณสามารถใช้ตัววนซ้ำ:
std::vector<char> path;
// ...
for (std::vector<char>::const_iterator i = path.begin(); i != path.end(); ++i)
std::cout << *i << ' ';
หากคุณต้องการที่จะปรับเปลี่ยนเนื้อหาของเวกเตอร์ในการห่วงแล้วใช้มากกว่าiterator
const_iterator
แต่มีอีกมากมายที่สามารถพูดเกี่ยวกับเรื่องนี้ หากคุณต้องการคำตอบที่คุณสามารถใช้ได้คุณสามารถหยุดที่นี่ มิฉะนั้นอ่านต่อ
อัตโนมัติ (C ++ 11) / typedef
นี่ไม่ใช่โซลูชันอื่น แต่เป็นส่วนเสริมสำหรับiterator
โซลูชันด้านบน หากคุณใช้มาตรฐาน C ++ 11 (หรือใหม่กว่า) จากนั้นคุณสามารถใช้auto
คำหลักเพื่อช่วยในการอ่าน:
for (auto i = path.begin(); i != path.end(); ++i)
std::cout << *i << ' ';
แต่ประเภทของi
จะไม่ใช่ const (เช่นคอมไพเลอร์จะใช้std::vector<char>::iterator
เป็นประเภทของi
)
ในกรณีนี้คุณอาจใช้เพียงแค่typedef
(ไม่ จำกัด เฉพาะ C ++ 11 และมีประโยชน์มากที่จะใช้ต่อไป):
typedef std::vector<char> Path;
Path path;
// ...
for (Path::const_iterator i = path.begin(); i != path.end(); ++i)
std::cout << *i << ' ';
เคาน์เตอร์
แน่นอนคุณสามารถใช้ประเภทจำนวนเต็มเพื่อบันทึกตำแหน่งของคุณในfor
วง:
for(int i=0; i<path.size(); ++i)
std::cout << path[i] << ' ';
หากคุณกำลังจะทำสิ่งนี้ควรใช้ประเภทสมาชิกของคอนเทนเนอร์ถ้ามีและเหมาะสม std::vector
มีประเภทสมาชิกที่เรียกว่าsize_type
สำหรับงานนี้: มันเป็นประเภทที่ส่งกลับโดยsize
วิธีการ
// Path typedef'd to std::vector<char>
for( Path::size_type i=0; i<path.size(); ++i)
std::cout << path[i] << ' ';
ทำไมไม่ใช้เพียงวิธีนี้เหนือiterator
โซลูชัน สำหรับกรณีที่เรียบง่ายคุณอาจจะได้เช่นกัน แต่ประเด็นก็คือiterator
คลาสนั้นเป็นวัตถุที่ออกแบบมาเพื่อทำงานนี้สำหรับวัตถุที่ซับซ้อนมากขึ้นซึ่งโซลูชันนี้จะไม่เหมาะ
เป็นช่วงสำหรับลูป (C ++ 11)
ดูวิธีการแก้ปัญหาของ Jefffrey ใน C ++ 11 (และใหม่กว่า) คุณสามารถใช้for
วนรอบตามใหม่ซึ่งมีลักษณะดังนี้:
for (auto i: path)
std::cout << i << ' ';
เนื่องจากpath
เป็นเวกเตอร์ของรายการ (อย่างชัดเจนstd::vector<char>
) วัตถุi
จึงเป็นประเภทของรายการของเวกเตอร์ (กล่าวคือเป็นประเภทchar
) วัตถุi
มีค่าที่เป็นสำเนาของรายการจริงในpath
วัตถุ ดังนั้นการเปลี่ยนแปลงทั้งหมดi
ในลูปจะไม่ถูกสงวนไว้ในpath
ตัวเอง นอกจากนี้หากคุณต้องการบังคับใช้ความจริงที่ว่าคุณไม่ต้องการที่จะสามารถเปลี่ยนค่าที่คัดลอกมาจากi
ในลูปคุณสามารถบังคับให้ประเภทi
เป็นconst char
ดังนี้:
for (const auto i: path)
std::cout << i << ' ';
หากคุณต้องการแก้ไขรายการในpath
คุณสามารถใช้การอ้างอิง:
for (auto& i: path)
std::cout << i << ' ';
และแม้ว่าคุณไม่ต้องการแก้ไขpath
หากการคัดลอกวัตถุมีราคาแพงคุณควรใช้การอ้างอิง const แทนการคัดลอกตามค่า:
for (const auto& i: path)
std::cout << i << ' ';
มาตรฐาน :: สำเนา
ดูคำตอบของโจชัว คุณสามารถใช้อัลกอริทึม STL std::copy
เพื่อคัดลอกเนื้อหาเวกเตอร์ลงในสตรีมเอาต์พุต นี่เป็นคำตอบที่สวยงามหากคุณพอใจกับมัน (และยิ่งกว่านั้นมันมีประโยชน์มากไม่ใช่แค่ในกรณีของการพิมพ์เนื้อหาของเวกเตอร์)
มาตรฐาน :: for_each
ดูวิธีการแก้ปัญหาของแม็กซ์ การใช้std::for_each
เกินความจำเป็นสำหรับสถานการณ์อย่างง่าย ๆ นี้ แต่เป็นวิธีแก้ปัญหาที่มีประโยชน์มากหากคุณต้องการทำมากกว่าการพิมพ์ไปที่หน้าจอ: การใช้std::for_each
ช่วยให้คุณสามารถดำเนินการใด ๆ (สมเหตุสมผล) กับเนื้อหาเวกเตอร์
โอเวอร์โหลด ostream :: ผู้ประกอบการ <<
ดูคำตอบของ Chris นี่เป็นคำตอบที่สมบูรณ์ยิ่งขึ้นสำหรับคำตอบอื่น ๆ เนื่องจากคุณยังต้องใช้หนึ่งในวิธีแก้ปัญหาข้างต้นในการรับน้ำหนักมากเกินไป ในตัวอย่างของเขาเขาใช้เคาน์เตอร์ในfor
วง ตัวอย่างเช่นนี่คือวิธีที่คุณสามารถใช้โซลูชันของ Joshuaได้อย่างรวดเร็ว:
template <typename T>
std::ostream& operator<< (std::ostream& out, const std::vector<T>& v) {
if ( !v.empty() ) {
out << '[';
std::copy (v.begin(), v.end(), std::ostream_iterator<T>(out, ", "));
out << "\b\b]";
}
return out;
}
การใช้โซลูชันอื่นใดควรตรงไปตรงมา
ข้อสรุป
โซลูชันใด ๆ ที่นำเสนอที่นี่จะใช้ได้ ขึ้นอยู่กับคุณและรหัสที่ดีที่สุด " สิ่งใดที่มีรายละเอียดมากกว่านี้น่าจะดีที่สุดสำหรับคำถามอื่นที่สามารถประเมินข้อดี / ข้อเสียได้อย่างเหมาะสม แต่เช่นเคยการตั้งค่าของผู้ใช้จะมีส่วนร่วมเสมอ: ไม่มีวิธีแก้ปัญหาใดที่นำเสนอผิด แต่บางคนก็ดูดีกว่า coder แต่ละตัว
ภาคผนวก
นี่เป็นโซลูชันเพิ่มเติมของรุ่นก่อนหน้าที่ฉันโพสต์ ตั้งแต่โพสต์นั้นยังคงได้รับความสนใจฉันตัดสินใจที่จะขยายและอ้างอิงถึงโซลูชั่นที่ยอดเยี่ยมอื่น ๆ ที่โพสต์ที่นี่ โพสต์ต้นฉบับของฉันมีคำพูดที่บอกว่าถ้าคุณได้รับการตั้งใจในการปรับเปลี่ยนเวกเตอร์ของคุณภายในfor
ห่วงแล้วมีสองวิธีให้โดยstd::vector
องค์ประกอบการเข้าถึง: std::vector::operator[]
ซึ่งไม่ได้ทำขอบเขตการตรวจสอบและstd::vector::at
ที่ไม่ดำเนินการตรวจสอบขอบเขต กล่าวอีกนัยหนึ่งat
จะโยนถ้าคุณพยายามเข้าถึงองค์ประกอบนอกเวกเตอร์และoperator[]
จะไม่ ฉันเพิ่งเพิ่มความคิดเห็นนี้เดิมเพื่อประโยชน์ในการกล่าวถึงบางสิ่งบางอย่างที่อาจเป็นประโยชน์ที่จะรู้ว่าถ้าใครไม่ได้แล้ว และฉันไม่เห็นความแตกต่างในขณะนี้ ดังนั้นภาคผนวกนี้