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

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

2
std :: back_inserter สำหรับ std :: set?
ฉันเดาว่านี่เป็นคำถามง่ายๆ ฉันต้องทำสิ่งนี้: std::set<int> s1, s2; s1 = getAnExcitingSet(); std::transform(s1.begin(), s1.end(), std::back_inserter(s2), ExcitingUnaryFunctor()); แน่นอนไม่ทำงานเนื่องจากไม่มี std::back_inserter ยังต้องการตัววนซ้ำ? ฉันไม่ได้ใช้ดังนั้นฉันไม่แน่ใจว่าจะทำอย่างไรpush_backstd::inserterstd::inserter ใครมีความคิด? แน่นอนตัวเลือกอื่นของฉันคือใช้เวกเตอร์สำหรับs2แล้วเรียงลำดับในภายหลัง อาจจะดีกว่านี้?
98 c++  algorithm  stl 

6
วิธีที่ทันสมัยในการกรอง STL container?
กลับมาที่ C ++ หลังจากหลายปีของ C # ฉันสงสัยว่าสิ่งที่ทันสมัย ​​- อ่าน: C ++ 11 - วิธีการกรองอาร์เรย์จะเป็นอย่างไรเช่นเราจะบรรลุสิ่งที่คล้ายกับแบบสอบถาม Linq นี้ได้อย่างไร: var filteredElements = elements.Where(elm => elm.filterProperty == true); เพื่อกรองเวกเตอร์ขององค์ประกอบ ( stringsสำหรับคำถามนี้)? ฉันหวังเป็นอย่างยิ่งว่าอัลกอริทึมสไตล์ STL แบบเก่า (หรือแม้กระทั่งส่วนขยายเช่นboost::filter_iterator) ที่ต้องการกำหนดวิธีการที่ชัดเจนจะถูกแทนที่ด้วยในตอนนี้?
98 c++  c++11  stl 

1
C ++ แปลงเวกเตอร์ <int> เป็นเวกเตอร์ <คู่>
เป็นวิธีการทำความสะอาดที่ดีที่จะแปลงอะไรไปstd::vector&lt;int&gt; intVec std::vector&lt;double&gt; doubleVecหรือโดยทั่วไปแล้วในการแปลงเวกเตอร์สองประเภทที่เปลี่ยนแปลงได้?

8
vector :: at กับ vector :: operator []
ฉันรู้ว่าat()มันช้ากว่า[]เนื่องจากการตรวจสอบขอบเขตซึ่งจะกล่าวถึงในคำถามที่คล้ายกันเช่นC ++ Vector ที่ / [] ความเร็วของตัวดำเนินการ หรือ:: std :: vector :: at () vs operator [] &lt;&lt; ผลลัพธ์ที่น่าประหลาดใจ !! ช้าลง 5 ถึง 10 เท่า / เร็วขึ้น! . ฉันไม่เข้าใจว่าat()วิธีนี้ดีสำหรับอะไร ถ้าฉันมีเวกเตอร์ธรรมดา ๆ แบบนี้: std::vector&lt;int&gt; v(10);และฉันตัดสินใจที่จะเข้าถึงองค์ประกอบของมันโดยใช้at()แทน[]ในสถานการณ์เมื่อฉันมีดัชนีiและฉันไม่แน่ใจว่ามันอยู่ในขอบเขตเวกเตอร์หรือไม่มันบังคับให้ฉันรวมมันด้วยการลองจับ บล็อก : try { v.at(i) = 2; } catch (std::out_of_range&amp; oor) { ... } แม้ว่าฉันจะสามารถรับพฤติกรรมเดียวกันได้โดยใช้size()และตรวจสอบดัชนีด้วยตัวเองซึ่งดูเหมือนง่ายและสะดวกมากสำหรับฉัน: if …
95 c++  stl  stdvector 

4
วิธีการรับองค์ประกอบบางอย่างในรายการโดยได้รับตำแหน่ง?
ฉันมีรายการ: list&lt;Object&gt; myList; myList.push_back(Object myObject); ฉันไม่แน่ใจ แต่ฉันมั่นใจว่านี่จะเป็นองค์ประกอบ "0" ในอาร์เรย์ มีฟังก์ชันใดบ้างที่ฉันสามารถใช้ที่จะส่งคืน "myObject"? Object copy = myList.find_element(0); เหรอ?
95 c++  list  stl 

2
วิธีการต่อท้ายรายการ <T> วัตถุกับวัตถุอื่น
ใน C ++ ฉันมีสองlist&lt;T&gt;วัตถุAและBฉันต้องการเพิ่มสมาชิกทั้งหมดBของA. ฉันได้ค้นหาแหล่งที่มาที่แตกต่างกันเล็กน้อยและไม่พบวิธีง่ายๆ (ei A.append(B);) และสิ่งนี้ทำให้ฉันประหลาดใจเล็กน้อย วิธีที่ดีที่สุดในการทำคืออะไร? เมื่อมันเกิดขึ้นฉันไม่สนใจ B หลังจากนี้ (มันจะถูกลบในบรรทัดถัดไป) ดังนั้นหากมีวิธีที่จะใช้ประโยชน์จากสิ่งนั้นเพื่อความสมบูรณ์แบบที่ดีขึ้นฉันก็สนใจเช่นกัน
94 c++  list  stl 


7
การตรวจสอบเนื้อหาคอนเทนเนอร์มาตรฐาน (std :: map) ด้วย gdb
สมมติว่ามีสิ่งนี้: #include &lt;map&gt; int main(){ std::map&lt;int,int&gt; m; m[1] = 2; m[2] = 4; return 0; } ฉันต้องการตรวจสอบเนื้อหาของแผนที่ที่รันโปรแกรมจาก gdb หากฉันลองใช้ตัวดำเนินการตัวห้อยฉันจะได้รับ: (gdb) p m[1] Attempt to take address of value not located in memory. การใช้วิธีค้นหาไม่ได้ผลลัพธ์ที่ดีกว่า: (gdb) p m.find(1) Cannot evaluate function -- may be inlined มีวิธีที่จะทำให้สำเร็จหรือไม่?
93 c++  stl  map  gdb 

8
std :: map insert หรือ std :: map find?
สมมติว่าเป็นแผนที่ที่คุณต้องการเก็บรักษารายการที่มีอยู่ 20% ของเวลารายการที่คุณกำลังแทรกเป็นข้อมูลใหม่ มีข้อได้เปรียบในการทำ std :: map :: find แล้ว std :: map :: insert โดยใช้ iterator ที่ส่งคืนหรือไม่? หรือมันเร็วกว่าที่จะพยายามแทรกแล้วดำเนินการโดยขึ้นอยู่กับว่าตัววนซ้ำระบุว่าบันทึกนั้นหรือไม่ได้ใส่หรือไม่?
93 c++  optimization  stl  stdmap 

8
ฉันควรใช้คอนเทนเนอร์ STL ใดสำหรับ FIFO
คอนเทนเนอร์ STL ใดที่เหมาะกับความต้องการของฉันมากที่สุด โดยพื้นฐานแล้วฉันมีคอนเทนเนอร์กว้าง 10 องค์ประกอบซึ่งฉันมีpush_backองค์ประกอบใหม่อย่างต่อเนื่องในขณะที่ใช้องค์ประกอบที่pop_frontเก่าแก่ที่สุด (ประมาณหนึ่งล้านครั้ง) ฉันกำลังใช้ a std::dequeสำหรับงานนี้ แต่สงสัยว่า a std::listจะมีประสิทธิภาพมากกว่านี้หรือไม่เพราะฉันไม่จำเป็นต้องจัดสรรตัวเองใหม่ (หรือบางทีฉันอาจเข้าใจผิดว่าเป็นstd::dequea std::vector?) หรือมีคอนเทนเนอร์ที่มีประสิทธิภาพมากกว่าสำหรับความต้องการของฉันหรือไม่? ปล. ฉันไม่ต้องการการเข้าถึงแบบสุ่ม
93 c++  stl  fifo 

8
ทางเลือกสำหรับเวกเตอร์ <bool>
ตามที่ (หวังว่า) เราทุกคนรู้ว่าvector&lt;bool&gt;พังโดยสิ้นเชิงและไม่สามารถถือว่าเป็นอาร์เรย์ C ได้ วิธีที่ดีที่สุดในการรับฟังก์ชันนี้คืออะไร? จนถึงตอนนี้ความคิดที่ฉันคิดคือ: ใช้vector&lt;char&gt;แทนหรือ ใช้คลาส Wrapper และมี vector&lt;bool_wrapper&gt; พวกคุณจัดการกับปัญหานี้อย่างไร? ฉันต้องการc_array()ฟังก์ชั่น เป็นคำถามข้างเคียงถ้าฉันไม่ต้องการc_array()วิธีการใดวิธีที่ดีที่สุดในการแก้ไขปัญหานี้หากฉันต้องการเข้าถึงโดยสุ่ม ฉันควรใช้ deque หรืออย่างอื่น? แก้ไข: ฉันต้องการการปรับขนาดแบบไดนามิก สำหรับผู้ที่ไม่ทราบvector&lt;bool&gt;มีความเชี่ยวชาญเพื่อให้boolใช้เวลา 1 บิต ดังนั้นคุณจึงไม่สามารถแปลงเป็นอาร์เรย์สไตล์ C ได้ ฉันเดาว่า "เสื้อคลุม" เป็นการเรียกชื่อผิด ฉันกำลังคิดบางอย่างเช่นนี้: แน่นอนฉันต้องอ่านmy_boolเนื่องจากปัญหาการจัดตำแหน่งที่เป็นไปได้ :( struct my_bool { bool the_bool; }; vector&lt;my_bool&gt; haha_i_tricked_you;
92 c++  stl  vector  boolean 

6
ความจุเริ่มต้นของเวกเตอร์ใน C ++
อะไรคือสิ่งที่capacity()ของstd::vectorซึ่งถูกสร้างขึ้นโดยใช้ constuctor เริ่มต้น? ฉันรู้ว่าค่าsize()เป็นศูนย์ เราสามารถระบุว่าเวกเตอร์ที่สร้างขึ้นเริ่มต้นไม่เรียกการจัดสรรหน่วยความจำฮีปได้หรือไม่? std::vector&lt;int&gt; iv; iv.reserve(2345);วิธีนี้มันจะเป็นไปได้ที่จะสร้างอาร์เรย์ที่มีสำรองโดยพลการโดยใช้การจัดสรรเดียวเช่น สมมติว่าด้วยเหตุผลบางประการฉันไม่ต้องการเริ่มsize()วันที่ 2345 ตัวอย่างเช่นบน Linux (g ++ 4.4.5, kernel 2.6.32 amd64) #include &lt;iostream&gt; #include &lt;vector&gt; int main() { using namespace std; cout &lt;&lt; vector&lt;int&gt;().capacity() &lt;&lt; "," &lt;&lt; vector&lt;int&gt;(10).capacity() &lt;&lt; endl; return 0; } 0,10ถูกพิมพ์ เป็นกฎหรือไม่หรือผู้ขาย STL ขึ้นอยู่กับ?

6
จะอัพเดต std :: map ได้อย่างไรหลังจากใช้วิธีค้นหา
จะอัพเดตค่าของคีย์ในstd::mapหลังจากใช้findวิธีนี้ได้อย่างไร? ฉันมีแผนที่และการประกาศตัววนซ้ำดังนี้: map &lt;char, int&gt; m1; map &lt;char, int&gt;::iterator m1_it; typedef pair &lt;char, int&gt; count_pair; ฉันใช้แผนที่เพื่อจัดเก็บจำนวนครั้งที่เกิดขึ้นของตัวละคร ฉันใช้ Visual C ++ 2010
92 c++  map  stl  stdmap 

2
เหตุใด std :: stack จึงใช้ std :: deque ตามค่าเริ่มต้น
เนื่องจากการดำเนินการเดียวที่จำเป็นสำหรับคอนเทนเนอร์ที่จะใช้ในสแต็กคือ: กลับ() push_back () pop_back () เหตุใดคอนเทนเนอร์เริ่มต้นจึงเป็น deque แทนที่จะเป็นเวกเตอร์ อย่าถอดการจัดสรรใหม่ให้บัฟเฟอร์ขององค์ประกอบก่อน front () เพื่อให้ push_front () เป็นการดำเนินการที่มีประสิทธิภาพ? องค์ประกอบเหล่านี้ไม่สูญเปล่าเนื่องจากจะไม่ถูกใช้ในบริบทของสแต็ก? หากไม่มีค่าใช้จ่ายสำหรับการใช้ deque ด้วยวิธีนี้แทนเวกเตอร์เหตุใดค่าเริ่มต้นสำหรับ priority_queue จึงเป็นเวกเตอร์จึงไม่ใช่ deque ด้วย (Priority_queue ต้องการ front (), push_back () และ pop_back () - โดยพื้นฐานแล้วเหมือนกับ stack) อัปเดตตามคำตอบด้านล่าง: ดูเหมือนว่าวิธีใช้ deque มักจะเป็นอาร์เรย์ขนาดตัวแปรของอาร์เรย์ขนาดคงที่ สิ่งนี้ทำให้เติบโตเร็วกว่าเวกเตอร์ (ซึ่งต้องมีการจัดสรรใหม่และการคัดลอก) ดังนั้นสำหรับบางสิ่งเช่นสแต็กที่เกี่ยวกับการเพิ่มและลบองค์ประกอบ deque น่าจะเป็นทางเลือกที่ดีกว่า priority_queue ต้องการการจัดทำดัชนีอย่างมากเนื่องจากการลบและการแทรกทุกครั้งทำให้คุณต้องเรียกใช้ pop_heap () หรือ …
91 c++  stl  containers 

5
std :: การเปรียบเทียบสตริง (ตรวจสอบว่าสตริงเริ่มต้นด้วยสตริงอื่นหรือไม่)
ฉันต้องการตรวจสอบว่า std: string ขึ้นต้นด้วย "xyz" หรือไม่ ฉันจะทำได้อย่างไรโดยไม่ต้องค้นหาสตริงทั้งหมดหรือสร้างสตริงชั่วคราวด้วย substr ()
90 c++  string  stl  compare 

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