คำถามติดแท็ก stl

ไลบรารีเทมเพลตมาตรฐานหรือ STL เป็นไลบรารี C ++ ของคอนเทนเนอร์ทั่วไปตัววนซ้ำอัลกอริทึมและวัตถุฟังก์ชัน เมื่อ C ++ ได้มาตรฐานส่วนใหญ่ของ STL ถูกนำไปใช้ใน Standard Library และบางส่วนใน Standard Library ก็บางครั้งก็เรียกกันอย่างผิด ๆ ว่า "STL"

8
std :: vector คัดลอกวัตถุด้วย push_back หรือไม่?
หลังจากการสืบสวนกับ valgrind ฉันได้สรุปว่า std :: vector สร้างสำเนาของวัตถุที่คุณต้องการ push_back เป็นเรื่องจริงเหรอ? เวกเตอร์ไม่สามารถเก็บการอ้างอิงหรือตัวชี้ของวัตถุโดยไม่มีการคัดลอก! ขอบคุณ
169 c++  stl  stdvector 

20
ข้อดีของ std :: for_each สำหรับลูป
มีข้อดีของการใด ๆstd::for_eachมากกว่าforห่วง? สำหรับฉันstd::for_eachดูเหมือนว่าจะเป็นอุปสรรคต่อการอ่านรหัสเท่านั้น ทำไมมาตรฐานการเข้ารหัสบางอย่างแนะนำให้ใช้?
168 c++  stl  foreach  coding-style 

11
ฉันจะล้าง std :: queue อย่างมีประสิทธิภาพได้อย่างไร
ฉันใช้ std :: queue สำหรับการใช้คลาส JobQueue (โดยทั่วไปคลาสนี้ดำเนินการแต่ละงานในลักษณะ FIFO) ในสถานการณ์สมมติหนึ่งฉันต้องการล้างคิวในนัดเดียว (ลบงานทั้งหมดออกจากคิว) ฉันไม่เห็นวิธีการที่ชัดเจนใด ๆ ที่มีอยู่ใน std :: queue class ฉันจะใช้วิธีการที่ชัดเจนสำหรับคลาส JobQueue ได้อย่างไร ฉันมีวิธีแก้ปัญหาง่ายๆอย่างหนึ่งในการวนรอบ แต่ฉันกำลังมองหาวิธีที่ดีกว่า //Clears the job queue void JobQueue ::clearJobs() { // I want to avoid pop in a loop while (!m_Queue.empty()) { m_Queue.pop(); } }
166 c++  stl  queue 

10
ฉันควรเก็บวัตถุทั้งหมดหรือตัวชี้ไปยังวัตถุในภาชนะบรรจุหรือไม่
การออกแบบระบบใหม่ตั้งแต่เริ่มต้น ฉันจะใช้ STL เพื่อจัดเก็บรายการและแผนที่ของวัตถุระยะยาว คำถาม: ฉันควรให้แน่ใจว่าวัตถุของฉันมีตัวสร้างสำเนาและจัดเก็บสำเนาของวัตถุภายในคอนเทนเนอร์ STL ของฉันหรือโดยทั่วไปจะดีกว่าที่จะจัดการชีวิต & ขอบเขตตัวเองและเพียงแค่เก็บพอยน์เตอร์ไปยังวัตถุเหล่านั้นในคอนเทนเนอร์ STL ของฉัน ฉันรู้ว่านี่เป็นรายละเอียดที่ค่อนข้างสั้น แต่ฉันกำลังมองหาคำตอบที่ดีกว่า "เชิงทฤษฎี" ถ้ามีอยู่เนื่องจากฉันรู้ว่าทั้งสองวิธีนี้เป็นไปได้ ข้อเสียที่ชัดเจนมากสองอย่างในการเล่นกับพอยน์เตอร์: 1) ฉันต้องจัดการการจัดสรร / การจัดสรรคืนของวัตถุเหล่านี้ด้วยตัวเองในขอบเขตที่นอกเหนือจาก STL 2) ฉันไม่สามารถสร้างวัตถุชั่วคราวในสแต็กและเพิ่มลงในคอนเทนเนอร์ของฉัน มีอะไรอีกบ้างที่ฉันขาดไป?
162 c++  stl  pointers 

3
วิธีรับ std :: vector pointer ไปยังข้อมูลดิบ?
ฉันพยายามที่จะใช้std::vectorเป็นcharอาร์เรย์ ฟังก์ชั่นของฉันใช้เป็นตัวชี้โมฆะ: void process_data(const void *data); ก่อนที่ฉันจะใช้รหัสนี้: char something[] = "my data here"; process_data(something); ซึ่งทำงานได้ตามที่คาดหวัง แต่ตอนนี้ฉันต้องการพลังของstd::vectorฉันจึงลองใช้รหัสนี้แทน: vector<char> something; *cut* process_data(something); คำถามคือฉันจะส่ง char vector ไปยังฟังก์ชันของฉันได้อย่างไรเพื่อให้ฉันสามารถเข้าถึงข้อมูล raw ของเวกเตอร์ได้ (ไม่ว่าจะเป็นรูปแบบใด - float ฯลฯ ) ฉันลองสิ่งนี้: process_data(&something); และนี่: process_data(&something.begin()); warning C4238: nonstandard extension used : class rvalue used as lvalueแต่มันกลับชี้ไปยังข้อมูลที่ไม่มีความหมายและหลังให้คำเตือน:
160 c++  stl  vector 

3
การรับประกันความซับซ้อนของคอนเทนเนอร์มาตรฐานคืออะไร?
เห็นได้ชัดว่า ;-) ภาชนะมาตรฐานมีรูปแบบการรับประกันบางส่วน การค้ำประกันประเภทใดและความแตกต่างระหว่างภาชนะประเภทต่างๆแตกต่างกันอย่างไร ทำงานจากหน้า SGI (เกี่ยวกับSTL ) ฉันมาด้วยสิ่งนี้: Container Types: ================ Container: Forward Container Reverse Container Random Access Container Sequence Front Insert Sequence Back Insert Sequence Associative Container Simple Associative Container Pair Associative Container Sorted Associative Container Multiple Associative Container Container Types mapped to Standard Containers ============================================= std::vector: Sequence …
160 c++  stl  containers  big-o 

9
C ++ valarray กับเวกเตอร์
ฉันชอบเวกเตอร์มาก พวกเขาดีและรวดเร็ว แต่ฉันรู้ว่าสิ่งนี้เรียกว่าวาลเลย์ ทำไมฉันถึงต้องใช้วาลเลย์แทนเวกเตอร์ ฉันรู้ว่า valarrays มีน้ำตาลประโยค แต่นอกเหนือจากนั้นเมื่อมีประโยชน์

6
ลำดับของการวนซ้ำผ่านแผนที่ std :: เป็นที่รู้จัก (และรับประกันโดยมาตรฐาน) หรือไม่
สิ่งที่ฉันหมายถึงคือ - เรารู้ว่าstd::mapองค์ประกอบของเรียงตามคีย์ สมมุติว่ากุญแจนั้นเป็นจำนวนเต็ม หากฉันซ้ำจากstd::map::begin()การstd::map::end()ใช้ a forการรับประกันมาตรฐานจะให้ฉันทำซ้ำตามลำดับผ่านองค์ประกอบที่มีคีย์เรียงตามลำดับจากน้อยไปหามากหรือไม่ ตัวอย่าง: std::map<int, int> map_; map_[1] = 2; map_[2] = 3; map_[3] = 4; for( std::map<int, int>::iterator iter = map_.begin(); iter != map_.end(); ++iter ) { std::cout << iter->second; } สิ่งนี้รับประกันว่าจะพิมพ์234หรือมีการกำหนดการใช้งานหรือไม่ เหตุผลชีวิตจริง: ฉันมีstd::mapกับintคีย์ ในสถานการณ์ที่หายากมากฉันต้องการวนซ้ำองค์ประกอบทั้งหมดด้วยคีย์มากกว่าintค่าที่เป็นรูปธรรม ใช่ดูเหมือนstd::vectorจะเป็นตัวเลือกที่ดีกว่า แต่สังเกต "สถานการณ์ที่หายากมาก" ของฉัน แก้ไข : ฉันรู้ว่าองค์ประกอบของstd::mapเรียงลำดับ .. ไม่จำเป็นต้องชี้ให้เห็น (สำหรับคำตอบส่วนใหญ่ที่นี่) …
158 c++  dictionary  stl  standards 

2
ตัววนซ้ำ -> วินาทีหมายความว่าอะไร
ใน C ++ ประเภทของ a std::map<>::iteratorคืออะไร? เรารู้ว่าอ็อบเจกต์itประเภทstd::map<A,B>::iteratorมีการโอเวอร์โหลดoperator ->ซึ่งส่งคืน a std::pair<A,B>*และว่าstd::pair<>มีfirstและsecondสมาชิก แต่สมาชิกสองคนนี้ทำอะไรกันและทำไมเราต้องเข้าถึงค่าที่เก็บไว้ในแผนที่ด้วยit->second?
157 c++  stl  iterator 

7
วิธีที่รวดเร็วในการคัดลอกเวกเตอร์หนึ่งไปยังอีก
ฉันชอบสองวิธี: void copyVecFast(const vec<int>& original) { vector<int> newVec; newVec.reserve(original.size()); copy(original.begin(),original.end(),back_inserter(newVec)); } void copyVecFast(vec<int>& original) { vector<int> newVec; newVec.swap(original); } คุณจะทำอย่างไรมันได้หรือไม่?
155 c++  algorithm  stl 

5
เมื่อมีการจัดสรรเวกเตอร์พวกเขาจะใช้หน่วยความจำบนกองหรือกอง?
ข้อความต่อไปนี้ทั้งหมดเป็นจริงหรือไม่? vector<Type> vect; //allocates vect on stack and each of the Type (using std::allocator) also will be on the stack vector<Type> *vect = new vector<Type>; //allocates vect on heap and each of the Type will be allocated on stack vector<Type*> vect; //vect will be on stack and Type* will be …
151 c++  stl  vector  stack  heap 

3
วิธีการตรวจสอบว่า std :: map มีรหัสโดยไม่ทำการแทรก?
วิธีเดียวที่ฉันได้ตรวจสอบการซ้ำคือการแทรกและตรวจสอบstd::pair.secondหาfalseแต่ปัญหาคือว่านี้ยังคงแทรกบางอย่างถ้าคีย์ไม่ได้ใช้ในขณะที่สิ่งที่ฉันต้องการคือmap.contains(key);ฟังก์ชั่น
148 c++  stl  map 

5
ตัวดำเนินการที่อยู่คู่ C ++? (&&)
ฉันกำลังอ่านซอร์สโค้ด STL และฉันไม่รู้ว่า&&ตัวดำเนินการที่อยู่ควรจะทำอะไร นี่คือตัวอย่างโค้ดจากstl_vector.h: vector& operator=(vector&& __x) // <-- Note double ampersands here { // NB: DR 675. this->clear(); this->swap(__x); return *this; } "Address of Address" มีความหมายหรือไม่? เหตุใดจึงมีตัวดำเนินการที่อยู่สองตัวแทนที่จะเป็นเพียงตัวดำเนินการเดียว



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.