คำถามติดแท็ก c++-standard-library

ในภาษาการเขียนโปรแกรม C ++ ไลบรารีมาตรฐาน C ++ คือชุดของคลาสและฟังก์ชันซึ่งอาจเขียนเป็นภาษาหลักหรือไม่ก็ได้และเป็นส่วนหนึ่งของ C ++

25
วิธีการแปลง std :: string เป็นตัวเล็ก?
ฉันต้องการแปลง a เป็นstd::stringตัวพิมพ์เล็ก ฉันรู้ถึงฟังก์ชั่นtolower()นี้ แต่ในอดีตที่ฉันเคยมีปัญหากับฟังก์ชั่นนี้และมันก็แทบจะไม่เหมาะอย่างยิ่งถ้าใช้กับ a std::stringจะต้องวนซ้ำตัวละครแต่ละตัว มีทางเลือกอื่นที่ใช้งานได้ 100% หรือไม่


5
อะไรคือความแตกต่างระหว่าง“ STL” และ“ ไลบรารีมาตรฐาน C ++”?
มีคนนำบทความนี้ไปสู่ความสนใจของฉันที่อ้างว่า(ฉันถอดความ)คำ STL ถูกนำไปใช้ในทางที่ผิดเพื่ออ้างถึงทั้งห้องสมุดมาตรฐาน C ++ แทนส่วนที่นำมาจาก SGI STL (... ) มันหมายถึง "STL" แม้จะมีคนเพียงไม่กี่คนที่ยังใช้ STL (ซึ่งได้รับการออกแบบที่ SGI) บางส่วนของ C ++ Standard Library นั้นขึ้นอยู่กับส่วนของ STL และเป็นส่วนเหล่านี้ที่หลายคน (รวมถึงผู้แต่งหลายคนและ cplusplus.com ซึ่งมีข้อผิดพลาดอย่างฉาวโฉ่ยังคงเรียกว่า "the STL" อย่างไรก็ตามนี่ไม่ถูกต้อง จริง ๆ แล้วมาตรฐาน C ++ ไม่เคยกล่าวถึง "STL" และมีความแตกต่างของเนื้อหาระหว่างทั้งสอง (... ) "STL" ไม่ค่อยถูกใช้เพื่ออ้างถึงบิตของ stdlib ที่เกิดขึ้นกับ SGI STL ผู้คนคิดว่ามันเป็นห้องสมุดมาตรฐานทั้งหมด มันได้รับการใส่ CV และมันก็ทำให้เข้าใจผิด …

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

8
การลบองค์ประกอบออกจาก std :: set ในขณะที่วนซ้ำ
ฉันต้องผ่านชุดและลบองค์ประกอบที่ตรงตามเกณฑ์ที่กำหนดไว้ล่วงหน้า นี่คือรหัสทดสอบที่ฉันเขียน: #include <set> #include <algorithm> void printElement(int value) { std::cout << value << " "; } int main() { int initNum[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; std::set<int> numbers(initNum, initNum + 10); // print '0 1 2 3 4 5 6 7 …


2
กลไกของการเพิ่มประสิทธิภาพสตริงสั้นใน libc ++ คืออะไร?
คำตอบนี้ให้ภาพรวมระดับสูงที่ดีของการเพิ่มประสิทธิภาพสตริงสั้น (SSO) อย่างไรก็ตามฉันต้องการทราบรายละเอียดเพิ่มเติมว่ามันทำงานอย่างไรในทางปฏิบัติโดยเฉพาะในการใช้งาน libc ++: สตริงต้องสั้นแค่ไหนจึงจะมีคุณสมบัติเป็น SSO สิ่งนี้ขึ้นอยู่กับสถาปัตยกรรมเป้าหมายหรือไม่? การใช้งานแยกความแตกต่างระหว่างสตริงแบบสั้นและแบบยาวเมื่อเข้าถึงข้อมูลสตริงอย่างไร มันง่ายเหมือนm_size <= 16หรือเป็นแฟล็กที่เป็นส่วนหนึ่งของตัวแปรสมาชิกอื่น ๆ หรือไม่? (ฉันคิดว่าm_sizeหรือบางส่วนอาจใช้ในการจัดเก็บข้อมูลสตริง) ผมถามคำถามนี้มาโดยเฉพาะสำหรับ libc ++ เพราะฉันรู้ว่ามันใช้ SSO นี้ถูกกล่าวถึงแม้ในlibc ++ หน้าแรก นี่คือข้อสังเกตบางประการหลังจากดูที่มา : libc ++ สามารถคอมไพล์โดยมีเลย์เอาต์หน่วยความจำที่แตกต่างกันเล็กน้อยสำหรับคลาสสตริงซึ่งถูกควบคุมโดย_LIBCPP_ALTERNATE_STRING_LAYOUTแฟล็ก เค้าโครงทั้งสองยังแยกความแตกต่างระหว่างเครื่องจักรเล็ก ๆ น้อย ๆ และเครื่องใหญ่เอนด์เซียนซึ่งทำให้เรามีรูปแบบต่างๆทั้งหมด 4 แบบ ฉันจะถือว่าเค้าโครง "ปกติ" และ endian น้อยในสิ่งต่อไปนี้ สมมติว่าต่อไปsize_typeคือ 4 ไบต์และนั่นvalue_typeคือ 1 ไบต์นี่คือลักษณะของสตริง 4 ไบต์แรกในหน่วยความจำ: // short string: …

2
วิธีรับขนาดไฟล์เป็นไบต์ด้วย C ++ 17
มีข้อผิดพลาดสำหรับระบบปฏิบัติการเฉพาะที่ฉันควรรู้หรือไม่? คำถามนี้มีคำซ้ำหลายรายการ ( 1 , 2 , 3 , 4 , 5 ) แต่ได้รับคำตอบเมื่อหลายสิบปีก่อน คำตอบที่ได้รับการโหวตสูงมากในหลายคำถามเหล่านี้ผิดในปัจจุบัน วิธีการจากอื่น ๆ (QA เก่า) บน. sx stat.h (wrapper sprintstatf ) ใช้ syscall tellg ()ผลตอบแทนต่อความหมายตำแหน่งแต่ไม่จำเป็นต้องไบต์ intประเภทผลตอบแทนไม่ได้


1
เหตุใดเวกเตอร์ <bool> ของ libc ++ :: const_reference จึงไม่ใช่บูล
มาตรา 23.3.7 คลาสvector&lt;bool&gt;[vector.bool] วรรค 1 ระบุ: template &lt;class Allocator&gt; class vector&lt;bool, Allocator&gt; { public: // types: typedef bool const_reference; ... อย่างไรก็ตามโปรแกรมนี้ไม่สามารถคอมไพล์เมื่อใช้ libc ++: #include &lt;vector&gt; #include &lt;type_traits&gt; int main() { static_assert(std::is_same&lt;std::vector&lt;bool&gt;::const_reference, bool&gt;{}, "?"); } นอกจากนี้ฉันทราบว่ามาตรฐาน C ++ มีความสอดคล้องกันในข้อกำหนดนี้ตลอดไปจนถึง C ++ 98 และฉันทราบเพิ่มเติมว่า libc ++ ไม่ได้ปฏิบัติตามข้อกำหนดนี้อย่างต่อเนื่องตั้งแต่การเปิดตัว libc ++ ครั้งแรก อะไรคือแรงจูงใจสำหรับการไม่ปฏิบัติตามนี้?

4
ฟีเจอร์ทดลองของ C ++ สมัยใหม่เชื่อถือได้สำหรับโครงการระยะยาวหรือไม่?
ฉันมีโปรเจ็กต์ที่ใช้ C ++ 11/14 อยู่ในขณะนี้ แต่มันต้องการบางอย่างเช่นstd::filesystemซึ่งมีเฉพาะใน C ++ 17 เท่านั้นดังนั้นฉันจึงไม่มีโอกาสใช้มันในตอนนี้ อย่างไรก็ตามฉันเห็นว่ามีอยู่ในคอมไพเลอร์ปัจจุบันของฉันในชื่อstd::experimental::filesystemไฟล์. เป็นความคิดที่ดีไหมที่จะใช้ฟีเจอร์ทดลองโดยสมมติว่าในอนาคตฉันสามารถเพิ่มสิ่งต่างๆเช่น: #ifdef CXX17 //if this is C++17 std::filesystem::something ...; #else std::experimental::filesystem::something ...; #endif ข้อกังวลของฉันคือ: 1. รับประกันหรือไม่ว่าคอมไพเลอร์ที่เข้ากันได้ทั้งหมดมีคุณสมบัติการทดลองเหมือนกัน? 2. ฟีเจอร์ทดลองมีแนวโน้มที่จะเกิดการเปลี่ยนแปลงครั้งใหญ่ที่ทำให้ไม่น่าเชื่อถือหรือไม่? อาจจะมีอะไรให้สงสัยอีก เหตุใดฉันจึงควรหรือไม่ควรใช้ ฉันงงงวยกับโครงการใหม่และไม่รู้ว่าจะตัดสินใจอะไร

2
ทำไมโอเปอเรเตอร์! = ถูกลบใน C ++ 20 สำหรับไลบรารีมาตรฐานหลายประเภท?
อ้างอิงจากcppreference , std::type_info::operator!=ถูกลบด้วย C ++ 20, แต่std::type_info::operator==ดูเหมือนว่ายังคงอยู่ อะไรคือเหตุผลเบื้องหลัง ฉันอาจเห็นด้วยว่าการเปรียบเทียบความไม่เท่าเทียมนั้นไร้ความหมาย แต่จากนั้นการเปรียบเทียบความเท่าเทียมจะไม่มีความหมายเช่นกันใช่ไหม ในทำนองเดียวกันoperator!=ชนิดไลบรารีมาตรฐานอื่น ๆ อีกมากมายรวมถึงคอนเทนเนอร์เช่นstd::unordered_map::operator!=และstd::unordered_set::operator!=จะถูกลบใน C ++ 20 ตาม cppreference ต้องเขียนif(!(id1 == id2))ไม่ทำให้รหัสใด ๆ ที่ชัดเจนเมื่อเทียบกับif(id1 != id2)ในทางตรงกันข้าม ...

4
วิธีการเปรียบเทียบลายเซ็นของทั้งสองฟังก์ชั่น?
มีวิธีการตรวจสอบว่าทั้งสองฟังก์ชั่นมีลายเซ็นเหมือนกันหรือไม่? ตัวอย่างเช่น: int funA (int a, int b); int funB (int a, int b); float funC (int a, int b); int funD (float a, int b); ในตัวอย่างนี้funAและเป็นชุดเดียวของฟังก์ชั่นที่ควรจะกลับfunBtrue

2
ทำไม `std :: string :: find ()` ไม่ส่งคืนตัววนซ้ำสุดท้ายเมื่อความล้มเหลว?
ฉันพบว่าพฤติกรรมของstd::string::findไม่สอดคล้องกับคอนเทนเนอร์ C ++ มาตรฐาน เช่น std::map&lt;int, int&gt; myMap = {{1, 2}}; auto it = myMap.find(10); // it == myMap.end() แต่สำหรับสตริง std::string myStr = "hello"; auto it = myStr.find('!'); // it == std::string::npos ทำไมไม่ควรล้มเหลวในmyStr.find('!')การกลับมาmyStr.end()แทนstd::string::npos? เนื่องจากstd::stringค่อนข้างจะพิเศษเมื่อเทียบกับตู้คอนเทนเนอร์อื่น ๆ ฉันสงสัยว่ามีเหตุผลจริง ๆ อยู่เบื้องหลังสิ่งนี้หรือไม่ (น่าแปลกที่ฉันไม่พบใครซักคนที่นี่)

2
GCC9 หลีกเลี่ยงสถานะไร้ค่าของ std :: variant ที่อนุญาตหรือไม่
ฉันเพิ่งติดตามการสนทนา Reddit ซึ่งนำไปสู่การเปรียบเทียบที่ดีของstd::visitการเพิ่มประสิทธิภาพในคอมไพเลอร์ ฉันสังเกตเห็นสิ่งต่อไปนี้: https://godbolt.org/z/D2Q5ED ทั้ง GCC9 และ Clang9 (ฉันเดาว่าพวกเขาแบ่งปัน stdlib เดียวกัน) ไม่ได้สร้างรหัสสำหรับการตรวจสอบและการโยนข้อยกเว้นที่ไม่มีค่าเมื่อทุกประเภทเป็นไปตามเงื่อนไขบางประการ สิ่งนี้นำไปสู่วิธีที่ดีกว่า codegen ดังนั้นฉันยกปัญหากับ MSVC STL และถูกนำเสนอด้วยรหัสนี้: template &lt;class T&gt; struct valueless_hack { struct tag {}; operator T() const { throw tag{}; } }; template&lt;class First, class... Rest&gt; void make_valueless(std::variant&lt;First, Rest...&gt;&amp; v) { try { v.emplace&lt;0&gt;(valueless_hack&lt;First&gt;()); } catch(typename …

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