เพื่อตอบคำถามของคุณคุณสามารถใช้ตัววนซ้ำ:
std::vector<char> path;
// ...
for (std::vector<char>::const_iterator i = path.begin(); i != path.end(); ++i)
std::cout << *i << ' ';
หากคุณต้องการที่จะปรับเปลี่ยนเนื้อหาของเวกเตอร์ในการห่วงแล้วใช้มากกว่าiteratorconst_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[]จะไม่ ฉันเพิ่งเพิ่มความคิดเห็นนี้เดิมเพื่อประโยชน์ในการกล่าวถึงบางสิ่งบางอย่างที่อาจเป็นประโยชน์ที่จะรู้ว่าถ้าใครไม่ได้แล้ว และฉันไม่เห็นความแตกต่างในขณะนี้ ดังนั้นภาคผนวกนี้