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

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

3
จะให้ฟังก์ชัน swap สำหรับคลาสของฉันได้อย่างไร?
อะไรคือวิธีที่เหมาะสมในการเปิดใช้swapอัลกอริทึมใน STL ของฉัน 1) swapสมาชิก ไม่std::swapใช้ SFINAE swapเคล็ดลับที่จะใช้สมาชิก 2) ยืนฟรีswapในเนมสเปซเดียวกัน 3) ความเชี่ยวชาญเฉพาะบางส่วนของstd::swap. 4) ทั้งหมดข้างต้น ขอขอบคุณ. แก้ไข: ดูเหมือนว่าฉันไม่ได้พูดคำถามของฉันอย่างชัดเจน โดยทั่วไปฉันมีคลาสเทมเพลตและฉันต้องการ STL algos เพื่อใช้วิธีการแลกเปลี่ยน (ที่มีประสิทธิภาพ) ที่ฉันเขียนสำหรับคลาสนั้น
89 c++  algorithm  stl  swap 

7
ทำไมเราไม่สามารถประกาศ std :: vector <AbstractClass>
หลังจากใช้เวลาในการพัฒนา C # อยู่พอสมควรฉันสังเกตเห็นว่าหากคุณประกาศคลาสนามธรรมเพื่อใช้เป็นอินเทอร์เฟซคุณจะไม่สามารถสร้างอินสแตนซ์เวกเตอร์ของคลาสนามธรรมนี้เพื่อเก็บอินสแตนซ์ของคลาสเด็กได้ #pragma once #include &lt;iostream&gt; #include &lt;vector&gt; using namespace std; class IFunnyInterface { public: virtual void IamFunny() = 0; }; class FunnyImpl: IFunnyInterface { public: virtual void IamFunny() { cout &lt;&lt; "&lt;INSERT JOKE HERE&gt;"; } }; class FunnyContainer { private: std::vector &lt;IFunnyInterface&gt; funnyItems; }; บรรทัดที่ประกาศเวกเตอร์ของคลาสนามธรรมทำให้เกิดข้อผิดพลาดนี้ใน MS VS2005: …

10
ทำไมฉันถึงชอบใช้เวกเตอร์เพื่อ deque
ตั้งแต่ ทั้งคู่เป็นคอนเทนเนอร์หน่วยความจำที่ต่อเนื่องกัน คุณลักษณะที่ชาญฉลาด deque มีเวกเตอร์เกือบทุกอย่าง แต่มีมากกว่านั้นเนื่องจากการแทรกที่ด้านหน้ามีประสิทธิภาพ ทำไมทุกคน Whould ต้องการstd::vectorเพื่อstd::deque?
87 c++  stl  vector  deque 

12
คัดลอกค่าแผนที่เป็นเวกเตอร์ใน STL
กำลังดำเนินการผ่านทาง STL ที่มีประสิทธิภาพในขณะนี้ รายการที่ 5 แนะนำว่าโดยปกติแล้วควรใช้ฟังก์ชัน range member กับคู่ขององค์ประกอบเดียว ขณะนี้ฉันต้องการคัดลอกค่าทั้งหมดในแผนที่ (เช่น - ฉันไม่ต้องการกุญแจ) ไปยังเวกเตอร์ วิธีที่สะอาดที่สุดในการทำเช่นนี้คืออะไร?
86 c++  stl  containers 

6
ทำไมฉันถึงต้องใช้ std :: get_tem Contemporary_buffer?
ควรใช้เพื่อวัตถุประสงค์std::get_temporary_bufferอะไร? Standard กล่าวต่อไปนี้: รับตัวชี้ไปยังหน่วยเก็บข้อมูลที่เพียงพอสำหรับจัดเก็บวัตถุ T ที่อยู่ติดกันได้สูงสุด n ตัว ฉันคิดว่าบัฟเฟอร์จะถูกจัดสรรบนสแต็ก แต่นั่นไม่เป็นความจริง ตามมาตรฐาน C ++ บัฟเฟอร์นี้ไม่ได้เกิดขึ้นชั่วคราว ฟังก์ชันนี้มีข้อดีอะไรบ้างเมื่อเทียบกับฟังก์ชันโกลบอล::operator newซึ่งไม่ได้สร้างอ็อบเจกต์ด้วย ฉันคิดถูกหรือไม่ที่ข้อความต่อไปนี้เทียบเท่า int* x; x = std::get_temporary_buffer&lt;int&gt;( 10 ).first; x = static_cast&lt;int*&gt;( ::operator new( 10*sizeof(int) ) ); ฟังก์ชันนี้มีเฉพาะสำหรับน้ำตาลไวยากรณ์หรือไม่? ทำไมถึงมีtemporaryชื่อ? มีการแนะนำกรณีการใช้งานหนึ่งกรณีในวารสารของดร. ด็อบบ์วันที่ 1 กรกฎาคม พ.ศ. 2539สำหรับการใช้อัลกอริทึม: หากไม่สามารถจัดสรรบัฟเฟอร์ได้หรือมีขนาดเล็กกว่าที่ร้องขออัลกอริทึมยังคงทำงานได้อย่างถูกต้องเพียงแค่ช้าลงเท่านั้น

4
คอนเทนเนอร์ STL ที่มีประเภทเฉพาะเป็นอาร์กิวเมนต์ทั่วไป
มีวิธีที่ฉันสามารถสร้างฟังก์ชั่นที่ใช้ภาชนะที่มีประเภทเฉพาะ (ขอพูดstd::string) เป็นพารามิเตอร์ void foo(const std::container&lt;std::string&gt; &amp;cont) { for(std::string val: cont) { std::cout &lt;&lt; val &lt;&lt; std::endl; } } และเรียกมันว่า stl container ทุกชนิดเป็น input หรือไม่? ชอบข้างบน? std::set&lt;std::string&gt; strset; std::vector&lt;std::string&gt; strvec; std::list&lt;std::string&gt; strlist; foo(strset); foo(strvec); foo(strlist);

4
ใช้กับ std :: transform กับ std :: back_inserter ได้ไหม
Cppreference มีโค้ดตัวอย่างนี้สำหรับstd::transform: std::vector&lt;std::size_t&gt; ordinals; std::transform(s.begin(), s.end(), std::back_inserter(ordinals), [](unsigned char c) -&gt; std::size_t { return c; }); แต่มันก็พูดว่า: std::transformไม่ได้รับประกันการประยุกต์ใช้ในการสั่งซื้อของหรือunary_op เมื่อต้องการใช้ฟังก์ชั่นลำดับในการสั่งซื้อหรือจะใช้ฟังก์ชั่นที่ปรับเปลี่ยนองค์ประกอบของลำดับการใช้งานbinary_opstd::for_each นี่น่าจะอนุญาตให้มีการใช้งานแบบขนาน อย่างไรก็ตามพารามิเตอร์ที่สามของstd::transformคือLegacyOutputIteratorซึ่งมี postcondition ต่อไปนี้สำหรับ++r: หลังจากการดำเนินการrนี้ไม่จำเป็นต้องเพิ่มและสำเนาใด ๆ ของค่าก่อนหน้าของrไม่จำเป็นต้องถูกยกเลิกหรือเพิ่มเติม สำหรับฉันแล้วดูเหมือนว่าการกำหนดผลลัพธ์จะต้องเกิดขึ้นตามลำดับ พวกเขาหมายถึงว่าแอปพลิเคชันunary_opอาจไม่เป็นระเบียบและจัดเก็บในตำแหน่งชั่วคราว แต่คัดลอกไปยังเอาต์พุตตามลำดับหรือไม่ ไม่ได้ดูเหมือนสิ่งที่คุณอยากจะทำ ไลบรารี C ++ ส่วนใหญ่ยังไม่ได้ใช้ตัวจัดการแบบขนานจริง ๆ แต่ Microsoft มี ผมค่อนข้างมั่นใจว่านี้เป็นรหัสที่เกี่ยวข้องและผมคิดว่ามันสายนี้populate()ฟังก์ชั่นการบันทึกเพื่อ iterators ชิ้นของการส่งออกซึ่งก็ไม่ได้เป็นสิ่งที่ถูกต้องที่จะทำเพราะ LegacyOutputIteratorสามารถจะถูกยกเลิกโดยการเพิ่มสำเนาของมัน ฉันกำลังคิดถึงอะไร

3
วิธีการรวบรวมเวลาเพื่อกำหนดประเภทอาร์กิวเมนต์ที่มีค่าใช้จ่ายน้อยที่สุด
ฉันมีแม่แบบที่มีลักษณะเช่นนี้ template &lt;typename T&gt; class Foo { public: Foo(const T&amp; t) : _t(t) {} private: const T _t; }; มีเทมเพลต metaprogramming เข้าใจวิธีที่จะหลีกเลี่ยงการใช้ const อ้างอิงในกรณีที่ประเภทอาร์กิวเมนต์เป็นเรื่องเล็กน้อยเช่นบูลหรือถ่าน? ชอบ: Foo(stl::smarter_argument&lt;T&gt;::type t) : _t(t) {}
15 c++  stl 

2
เวกเตอร์เป็นคีย์ทำงานอย่างไรภายใน C ++
คำตอบ SO นี้บอกว่าแผนที่ STL พร้อม Vector สำหรับคีย์นั้นเวกเตอร์สามารถใช้เป็นคีย์ได้ ดังนั้นเมื่อเราใช้เวกเตอร์เป็นกุญแจ ใช้งานได้จริงอย่างไรเนื่องจากคีย์ต้องไม่ซ้ำกันดังนั้นเมื่อเราแทรกเวกเตอร์อื่นที่มีองค์ประกอบเดียวกันจะmapตรวจสอบองค์ประกอบที่ซ้ำกันตามองค์ประกอบหรือชื่อของเวกเตอร์ระบุบางอย่าง เช่นเดียวกับชื่อของอาร์เรย์หมายถึงที่อยู่ฐาน ดังนั้นอาเรย์สามารถใช้เป็นคีย์ได้เนื่องจากที่อยู่พื้นฐานสามารถใช้เป็นคีย์ในกรณีนี้ แต่คีย์ในกรณีของเวกเตอร์คืออะไร มันทำงานอย่างไรภายใน เพราะเมื่อฉันพิมพ์ชื่อของเวกเตอร์ฉันจะได้รับข้อผิดพลาด vector&lt;int&gt; v; cout&lt;&lt;v; //error
14 c++  arrays  dictionary  vector  stl 

1
`string.assign (string.data (), 5)` มีการกำหนดชัดเจนหรือ UB หรือไม่
เพื่อนร่วมงานต้องการเขียนสิ่งนี้: std::string_view strip_whitespace(std::string_view sv); std::string line = "hello "; line = strip_whitespace(line); ผมบอกว่ากลับมาstring_viewทำให้ฉันไม่สบายใจเบื้องต้นและนอกจาก aliasing ที่นี่ดูเหมือน UB ให้ฉัน ฉันสามารถพูดด้วยความมั่นใจว่าในกรณีนี้จะเทียบเท่ากับline = strip_whitespace(line) line = std::string_view(line.data(), 5)ฉันเชื่อว่าจะเรียกstring::operator=(const T&amp;) [with T=string_view]ซึ่งถูกกำหนดให้เทียบเท่ากับline.assign(const T&amp;) [with T=string_view]ซึ่งถูกกำหนดให้เทียบเท่ากับline.assign(line.data(), 5)ซึ่งถูกกำหนดให้ทำเช่นนี้: Preconditions: [s, s + n) is a valid range. Effects: Replaces the string controlled by *this with a copy …

3
ฉันสามารถใช้ std :: transform แบบแทนที่ด้วยนโยบายการดำเนินการแบบขนานได้หรือไม่
ถ้าฉันไม่ผิดฉันสามารถทำให้std::transformการดำเนินการในสถานที่ โดยใช้ช่วงเดียวกับ input และ output iterator สมมติว่าฉันมีstd::vectorวัตถุvecแล้วฉันจะเขียน std::transform(vec.cbegin(),vec.cend(),vec.begin(),unary_op) unary_opโดยใช้การดำเนินการที่เหมาะสมเอก ด้วยการใช้มาตรฐาน C ++ 17 ฉันต้องการดำเนินการแปลงแบบขนานโดยการใส่std::execution::parเข้าไปในนั้นเป็นอาร์กิวเมนต์แรก นี้จะทำให้ฟังก์ชั่นการเดินทางจากการโอเวอร์โหลด (1) (2) ในบทความ cppreference std::transformบน อย่างไรก็ตามความคิดเห็นที่เกินพิกัดนี้พูดว่า: unary_op[... ] ต้องไม่ทำให้ตัววนซ้ำใด ๆ รวมถึงตัววนซ้ำสิ้นสุดหรือแก้ไของค์ประกอบใด ๆ ของช่วงที่เกี่ยวข้อง (ตั้งแต่ C ++ 11) "แก้ไของค์ประกอบใด ๆ " จริงๆหมายถึงฉันไม่สามารถใช้อัลกอริทึมในสถานที่หรือกำลังพูดถึงรายละเอียดที่แตกต่างที่ฉันตีความผิด?

1
หน่วยความจำรั่วในระหว่าง unordered_map :: ใส่ข้อยกเว้น KeyEqual กับ GCC - ทำลายการรับประกันความปลอดภัยข้อยกเว้นที่รัดกุมหรือไม่
ฉันใช้ GCC 7.3.1 แต่ได้ทดสอบกับ coliru ด้วยซึ่งฉันเชื่อว่าเป็นรุ่น 9.2.0 สร้างด้วยสิ่งต่อไปนี้: g++ -fsanitize=address -fno-omit-frame-pointer rai.cpp ที่นี่rai.cpp: #include &lt;iostream&gt; #include &lt;unordered_map&gt; int main() { try { struct MyComp { bool operator()(const std::string&amp;, const std::string&amp;) const { throw std::runtime_error("Nonono"); } }; std::unordered_map&lt;std::string, std::string, std::hash&lt;std::string&gt;, MyComp&gt; mymap; mymap.insert(std::make_pair("Hello", "There")); mymap.insert(std::make_pair("Hello", "There")); // Hash match forces compare …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.