คำถามติดแท็ก c++14

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

2
วิธีการใช้อัลกอริทึมการเรียงลำดับแบบคลาสสิกใน C ++ ที่ทันสมัย?
std::sortอัลกอริทึม (และญาติของตนstd::partial_sortและstd::nth_element) จาก ++ ห้องสมุด C มาตรฐานในการใช้งานมากที่สุดควบซับซ้อนและไฮบริดของขั้นตอนวิธีการเรียงลำดับประถมศึกษามากขึ้นเช่นการเลือกเรียงลำดับการจัดเรียงแทรกรวดเร็วเรียงลำดับผสานเรียงลำดับหรือการจัดเรียงกอง มีคำถามมากมายที่นี่และในเว็บไซต์น้องสาวเช่นhttps://codereview.stackexchange.com/ที่เกี่ยวข้องกับข้อบกพร่องความซับซ้อนและด้านอื่น ๆ ของการใช้งานของอัลกอริทึมการเรียงลำดับแบบคลาสสิกเหล่านี้ การนำไปใช้งานที่นำเสนอส่วนใหญ่ประกอบด้วยลูปดิบใช้การจัดการดัชนีและประเภทที่เป็นรูปธรรมและโดยทั่วไปจะไม่วิเคราะห์ในแง่ของความถูกต้องและมีประสิทธิภาพ คำถาม : อัลกอริทึมการเรียงลำดับแบบคลาสสิกที่กล่าวถึงข้างต้นสามารถนำไปใช้งานได้อย่างไรโดยใช้ C ++ สมัยใหม่ ไม่มีลูปแบบดิบแต่รวมการสร้างแบบอัลกอริทึมของ Standard Library เข้าด้วยกัน<algorithm> อินเทอร์เฟซตัววนซ้ำและการใช้เทมเพลตแทนการจัดการดัชนีและชนิดที่เป็นรูปธรรม สไตล์ C ++ 14รวมถึงไลบรารี่มาตรฐานเต็มรูปแบบรวมถึงตัวลดสัญญาณเสียงวากยสัมพันธ์เช่นautoนามแฝงเทมเพลตตัวเปรียบเทียบโปร่งใสและแลมบ์ดา polymorphic หมายเหตุ : สำหรับการอ้างอิงเพิ่มเติมเกี่ยวกับการใช้งานของอัลกอริทึมการเรียงลำดับดูWikipedia , รหัส Rosettaหรือhttp://www.sorting-algorithms.com/ ตามอนุสัญญาของฌอนพาเรนต์ (สไลด์ 39) ห่วงดิบเป็นวงที่forยาวกว่าองค์ประกอบของสองฟังก์ชันกับตัวดำเนินการ ดังนั้นf(g(x));หรือf(x); g(x);หรือf(x) + g(x);ไม่ได้ลูปดิบและไม่เป็นลูปในselection_sortและinsertion_sortด้านล่าง ฉันทำตามคำศัพท์ของ Scott Meyers เพื่อแสดง C ++ 1y ปัจจุบันเป็น C …

2
C ++ ที่ทันสมัยช่วยเพิ่มประสิทธิภาพให้คุณได้ฟรีหรือไม่?
บางครั้งมีการอ้างว่า C ++ 11/14 สามารถเพิ่มประสิทธิภาพให้คุณได้แม้เพียงแค่รวบรวมรหัส C ++ 98 การให้เหตุผลมักตามแนวความหมายของการย้ายเนื่องจากในบางกรณีตัวสร้าง rvalue จะถูกสร้างขึ้นโดยอัตโนมัติหรือตอนนี้เป็นส่วนหนึ่งของ STL ตอนนี้ฉันสงสัยว่าก่อนหน้านี้กรณีเหล่านี้ได้รับการจัดการโดย RVO หรือการเพิ่มประสิทธิภาพคอมไพเลอร์ที่คล้ายกันแล้ว คำถามของฉันคือถ้าคุณสามารถให้ตัวอย่างจริงของรหัส C ++ 98 ที่ไม่มีการดัดแปลงให้ทำงานได้เร็วขึ้นโดยใช้คอมไพเลอร์ที่สนับสนุนคุณสมบัติภาษาใหม่ ฉันเข้าใจว่าคอมไพเลอร์ที่ได้มาตรฐานไม่จำเป็นต้องทำการคัดลอกและโดยเหตุผลความหมายของการย้ายอาจทำให้เกิดความเร็ว แต่ฉันต้องการเห็นกรณีทางพยาธิวิทยาน้อยลงถ้าคุณต้องการ แก้ไข: เพื่อให้ชัดเจนฉันไม่ได้ถามว่าคอมไพเลอร์ใหม่นั้นเร็วกว่าคอมไพเลอร์เก่าหรือไม่ แต่ถ้ามีโค้ดที่เพิ่ม -std = c ++ 14 ให้คอมไพเลอร์ของฉันมันจะทำงานเร็วขึ้น (หลีกเลี่ยงการทำสำเนา แต่ถ้าคุณ สามารถเกิดขึ้นกับสิ่งอื่นนอกเหนือจากความหมายย้ายฉันก็มีความสนใจเช่นกัน)

6
C ++ 11, 14, 17 หรือ 20 มีค่าคงที่มาตรฐานสำหรับ pi หรือไม่?
มีปัญหาค่อนข้างโง่กับหมายเลข pi ใน C และ C ++ เท่าที่ฉันรู้M_PIกำหนดไว้math.hไม่จำเป็นต้องมีมาตรฐาน มาตรฐาน C ++ ใหม่แนะนำคณิตศาสตร์ที่ซับซ้อนจำนวนมากในไลบรารีมาตรฐาน - ฟังก์ชันไฮเพอร์โบลิกstd::hermiteและstd::cyl_bessel_iเครื่องกำเนิดเลขสุ่มที่แตกต่างกันเป็นต้น มาตรฐาน 'ใหม่' มีค่าคงที่สำหรับ pi หรือไม่? ถ้าไม่ - ทำไม คณิตศาสตร์ที่ซับซ้อนทั้งหมดนี้ทำงานอย่างไรหากปราศจากมัน? ฉันตระหนักถึงคำถามที่คล้ายกันเกี่ยวกับ pi ใน C ++ (เป็นเวลาหลายปีและมาตรฐานเก่า); ฉันต้องการทราบสถานะปัจจุบันของปัญหา ฉันสนใจด้วยเช่นกันว่าทำไมทำไม C ++ ถึงไม่มีค่าคงที่ pi แต่มีคณิตศาสตร์ที่ซับซ้อนกว่าเยอะ UPD: ฉันรู้ว่าฉันสามารถกำหนด pi ตัวเองเป็น 4 * atan (1) หรือ acos (1) หรือ double pi …

8
แลมบ์ดาจับภาพอ้างอิง const
มันเป็นไปได้ที่จะจับโดยอ้างอิง const ในการแสดงออกแลมบ์ดา? ฉันต้องการให้การบ้านที่ระบุไว้ด้านล่างล้มเหลวตัวอย่างเช่น: #include <cstdlib> #include <vector> #include <string> #include <algorithm> using namespace std; int main() { string strings[] = { "hello", "world" }; static const size_t num_strings = sizeof(strings)/sizeof(strings[0]); string best_string = "foo"; for_each( &strings[0], &strings[num_strings], [&best_string](const string& s) { best_string = s; // this should fail } …
166 c++  c++11  lambda  c++14 

2
เดคไทป์ (อัตโนมัติ) มีประโยชน์อะไรบ้าง?
Наэтотвопросестьответына Stack Overflow нарусском : Конструкция decltype (อัตโนมัติ) ใน c ++ 14 มีการใช้decltype(auto)สำนวน โดยปกติการใช้งานของมันคือการอนุญาตให้มีautoการประกาศใช้decltypeกฎระเบียบเกี่ยวกับการแสดงออกที่กำหนด ค้นหาตัวอย่างของการใช้คำว่า "ดี" ของสำนวนฉันสามารถนึกถึงสิ่งต่าง ๆ ดังต่อไปนี้ (โดยสก็อตต์เมเยอร์ส ) นั่นคือสำหรับการคืนค่าประเภทของฟังก์ชัน : template<typename ContainerType, typename IndexType> // C++14 decltype(auto) grab(ContainerType&& container, IndexType&& index) { authenticateUser(); return std::forward<ContainerType>(container)[std::forward<IndexType>(index)]; } มีตัวอย่างอื่น ๆ ที่คุณสมบัติภาษาใหม่นี้มีประโยชน์หรือไม่

2
`void_t` ทำงานอย่างไร
ผมเฝ้าดูการพูดคุยวอลเตอร์บราวน์ที่ Cppcon14 เกี่ยวกับการเขียนโปรแกรมแม่แบบที่ทันสมัย ( Part I , Part II ) ที่เขานำเสนอของเขาvoid_tเทคนิค SFINAE ตัวอย่าง: กำหนดเทมเพลตตัวแปรแบบง่ายที่ประเมินvoidว่าถ้าอาร์กิวเมนต์เท็มเพลตทั้งหมดมีรูปแบบที่ดี: template< class ... > using void_t = void; และลักษณะต่อไปนี้ที่ตรวจสอบการมีอยู่ของตัวแปรสมาชิกที่เรียกว่าสมาชิก : template< class , class = void > struct has_member : std::false_type { }; // specialized as has_member< T , void > or discarded (sfinae) template< class …
149 c++  templates  c++14  sfinae 

7
ฉันควรใช้การลดชนิดการส่งคืนอัตโนมัติ C ++ 14 เมื่อใด
ด้วยการเปิดตัว GCC 4.8.0 เรามีคอมไพเลอร์ที่รองรับการหักค่าส่งคืนชนิดอัตโนมัติซึ่งเป็นส่วนหนึ่งของ C ++ 14 ด้วย-std=c++1yฉันสามารถทำสิ่งนี้: auto foo() { //deduced to be int return 5; } คำถามของฉันคือ: ฉันควรใช้คุณสมบัตินี้เมื่อใด เมื่อใดที่จำเป็นและเมื่อใดที่ต้องทำให้รหัสสะอาดขึ้น สถานการณ์ 1 สถานการณ์แรกที่ฉันนึกได้คือเมื่อเป็นไปได้ ทุกฟังก์ชั่นที่สามารถเขียนด้วยวิธีนี้ควรจะเป็น ปัญหาเกี่ยวกับสิ่งนี้คือมันอาจไม่ทำให้โค้ดอ่านง่ายขึ้นเสมอไป สถานการณ์ที่ 2 สถานการณ์ต่อไปคือการหลีกเลี่ยงประเภทการคืนที่ซับซ้อนมากขึ้น เป็นตัวอย่างที่เบามาก: template<typename T, typename U> auto add(T t, U u) { //almost deduced as decltype(t + u): decltype(auto) would return t …

2
#pragma เป็นส่วนหนึ่งของมาตรฐาน C ++ 11 หรือไม่
ตามเนื้อผ้าวิธีมาตรฐานและแบบพกพาเพื่อหลีกเลี่ยงการรวมส่วนหัวหลายรายการใน C ++ คือ / คือการใช้#ifndef - #define - #endifชุดรูปแบบคำสั่ง pre-compiler หรือที่เรียกว่าชุดรูปแบบมหภาคการ์ด (ดูตัวอย่างรหัสด้านล่าง) #ifndef MY_HEADER_HPP #define MY_HEADER_HPP ... #endif ในการใช้งานมากที่สุด / คอมไพเลอร์ (ดูภาพด้านล่าง) แต่มีอีกทางเลือก "สง่างาม" #pragma onceที่ทำหน้าที่วัตถุประสงค์เช่นเดียวกับโครงการแมโครยามที่เรียกว่า #pragma onceมีข้อดีหลายประการเมื่อเทียบกับชุดรูปแบบการป้องกันมาโครซึ่งรวมถึงรหัสน้อยกว่าการหลีกเลี่ยงการปะทะกันของชื่อและบางครั้งการปรับปรุงความเร็วในการคอมไพล์ ฉันทำการวิจัยบางอย่างฉันรู้ว่าถึงแม้#pragma onceคำสั่งจะได้รับการสนับสนุนจากคอมไพเลอร์ที่รู้จักกันเกือบทั้งหมด แต่ก็มีความขุ่นเคืองว่า#pragma onceคำสั่งนั้นเป็นส่วนหนึ่งของมาตรฐาน C ++ 11 หรือไม่ คำถาม: บางคนสามารถอธิบายได้ว่า#pragma onceคำสั่งนั้นเป็นส่วนหนึ่งของมาตรฐาน C ++ 11 หรือไม่? หากไม่ได้เป็นส่วนหนึ่งของมาตรฐาน C ++ 11 มีแผนใดบ้างในการรวมไว้ในรุ่นที่ใหม่กว่า (เช่น …

1
คัดลอก / ย้ายการกำหนดใน std :: vector :: erase () และ std :: deque :: erase ()
ในขั้นตอนของการตอบคำถามอื่นฉัน stumbled เมื่อกรมธรรม์ที่แตกต่างกันเล็กน้อยและstd::vector::erase()std::deque::erase() นี่คือสิ่งที่ C ++ 14 พูดเกี่ยวกับstd::deque::erase( [deque.modifiers]/4-6เน้นของฉัน): ผลกระทบ: ... ความซับซ้อน:จำนวนการเรียกใช้ตัวทำลายจะเหมือนกับจำนวนขององค์ประกอบที่ลบ แต่จำนวนการเรียกไปยังตัวดำเนินการกำหนดไม่เกินจำนวนองค์ประกอบที่น้อยกว่าก่อนองค์ประกอบที่ถูกลบและจำนวนองค์ประกอบหลังจาก องค์ประกอบที่ถูกลบ โยน:Tไม่มีอะไรเว้นแต่ยกเว้นจะโยนโดยตัวสร้างสำเนาคอนสตรัคย้ายผู้ประกอบการที่ได้รับมอบหมายหรือผู้ประกอบการที่ได้รับมอบหมายย้ายของ และนี่คือสิ่งที่กล่าวถึงเกี่ยวกับstd::vector::erase( [vector.modifiers]/3-5): ผลกระทบ: ... ซับซ้อน: destructor ของTที่เรียกว่าจำนวนครั้งที่เท่ากับจำนวนขององค์ประกอบลบ แต่ผู้ประกอบการที่ได้รับมอบหมายย้ายของTที่เรียกว่าจำนวนครั้งที่เท่ากับจำนวนขององค์ประกอบในเวกเตอร์หลังจากองค์ประกอบลบ โยน:Tไม่มีอะไรเว้นแต่ยกเว้นจะโยนโดยตัวสร้างสำเนาคอนสตรัคย้ายผู้ประกอบการที่ได้รับมอบหมายหรือผู้ประกอบการที่ได้รับมอบหมายย้ายของ อย่างที่คุณเห็นข้อกำหนดข้อยกเว้นสำหรับทั้งสองอย่างนั้นเหมือนกัน แต่std::vectorมีการกล่าวถึงอย่างชัดเจนว่ามีการเรียกตัวดำเนินการกำหนดย้าย นอกจากนี้ยังมีความจำเป็นสำหรับการTที่จะเป็นMoveAssignableสำหรับerase()การทำงานกับทั้งstd::vectorและstd::deque(ตารางที่ 100) แต่นี่ไม่ได้หมายความถึงการปรากฏตัวของผู้ประกอบการที่ได้รับมอบหมายย้ายหนึ่งสามารถกำหนดผู้ประกอบการที่ได้รับมอบหมายคัดลอกและได้กำหนดดำเนินการกำหนดย้ายและชั้นนี้จะ เป็นMoveAssignable. ในกรณีนี้ฉันตรวจสอบด้วย GCC และ Clang และstd::vector::erase()เรียกตัวดำเนินการคัดลอกการมอบหมายงานหากไม่มีตัวดำเนินการกำหนดย้ายและstd::deque::erase()ทำแบบเดียวกัน ( DEMO ) คำถามคือ: ฉันพลาดอะไรไปหรือนี่เป็นปัญหา (บรรณาธิการ) ในมาตรฐาน? ปรับปรุง: ฉันได้ส่งlwg รุ่น #

4
ความแตกต่างระหว่าง std :: make_unique และ std :: unique_ptr กับ new
ไม่std::make_uniqueได้มีผลประโยชน์ใด ๆ เช่นประสิทธิภาพstd::make_shared? เมื่อเทียบกับการสร้างด้วยตนเองstd::unique_ptr: std::make_unique<int>(1); // vs std::unique_ptr<int>(new int(1));

3
แลมด้าทั่วไปทำงานอย่างไรใน C ++ 14
แลมบ์ดาทั่วไปทำงานอย่างไร ( autoคีย์เวิร์ดเป็นประเภทอาร์กิวเมนต์) ในมาตรฐาน C ++ 14 มันขึ้นอยู่กับแม่แบบ C ++ ที่คอมไพเลอร์ประเภทอาร์กิวเมนต์แต่ละตัวสร้างฟังก์ชันใหม่ที่มีเนื้อความเดียวกัน แต่แทนที่ประเภท (ความหลากหลายของเวลาคอมไพล์) หรือคล้ายกับชื่อสามัญของ Java (การลบประเภท) มากกว่าหรือไม่? ตัวอย่างโค้ด: auto glambda = [](auto a) { return a; };
114 c++  lambda  auto  c++14 

13
ฉันจะหลีกเลี่ยง "for" ลูปที่มีเงื่อนไข "if" ภายในด้วย C ++ ได้อย่างไร
ด้วยโค้ดเกือบทั้งหมดที่ฉันเขียนฉันมักจะจัดการกับปัญหาการลดการตั้งค่าในคอลเลกชั่นที่ท้ายที่สุดแล้วมีเงื่อนไข "if" ที่ไร้เดียงสาอยู่ภายใน นี่คือตัวอย่างง่ายๆ: for(int i=0; i<myCollection.size(); i++) { if (myCollection[i] == SOMETHING) { DoStuff(); } } ด้วยภาษาที่ใช้งานได้ฉันสามารถแก้ปัญหาได้โดยการลดคอลเล็กชันลงในคอลเล็กชันอื่น (อย่างง่ายดาย) จากนั้นดำเนินการทั้งหมดกับชุดที่ลดลงของฉัน ใน pseudocode: newCollection <- myCollection where <x=true map DoStuff newCollection และในรูปแบบ C อื่น ๆ เช่น C # ฉันสามารถลดด้วย where clause like foreach (var x in myCollection.Where(c=> c == SOMETHING)) { …
111 c++  c++11  c++14 

4
ตัวเปรียบเทียบแบบโปร่งใสคืออะไร?
ใน C ++ 14 ดูเหมือนว่า Associative container จะเปลี่ยนไปจาก C ++ 11 - [Associative.reqmts] / 13 พูดว่า: แม่แบบฟังก์ชันสมาชิกfind, count, lower_bound, upper_boundและequal_rangeจะได้มีส่วนร่วมในการแก้ปัญหาเกินเว้นแต่ชนิดCompare::is_transparentที่มีอยู่ จุดประสงค์ของการสร้างตัวเปรียบเทียบ "โปร่งใส" คืออะไร? C ++ 14 ยังมีเทมเพลตไลบรารีเช่นนี้: template <class T = void> struct less { constexpr bool operator()(const T& x, const T& y) const; typedef T first_argument_type; typedef T second_argument_type; …
106 c++  c++14  c++-faq 

3
C ++ 14 เพิ่มคีย์เวิร์ดใหม่ใน C ++ หรือไม่
คณะกรรมการมาตรฐาน C ++ มีแนวโน้มที่จะหลีกเลี่ยงการเพิ่มคำหลักใหม่ในภาษา แต่ C ++ 11 นั้นไม่เป็นเช่นนั้น ตัวอย่างบางส่วน: constexpr decltype thread_local auto // New usage noexcept nullptr static_assert alignof alignas มีคำหลักใหม่ ๆ ที่ใช้กับ C ++ 14 หรือไม่?
103 c++  c++11  keyword  c++14 

3
การเชื่อมโยงวัตถุ C ++ 17, C ++ 14 และ C ++ 11 นั้นปลอดภัยหรือไม่
สมมติว่าฉันมีออบเจ็กต์ที่คอมไพล์สามชิ้นทั้งหมดสร้างโดยคอมไพเลอร์ / เวอร์ชันเดียวกัน : A ถูกรวบรวมด้วยมาตรฐาน C ++ 11 B ถูกรวบรวมด้วยมาตรฐาน C ++ 14 C ถูกคอมไพล์ด้วยมาตรฐาน C ++ 17 เพื่อความเรียบง่ายสมมติว่าส่วนหัวทั้งหมดเขียนด้วย C ++ 11 โดยใช้เฉพาะโครงสร้างที่ความหมายไม่ได้เปลี่ยนแปลงระหว่างเวอร์ชันมาตรฐานทั้งสามดังนั้นการพึ่งพาระหว่างกันจึงถูกแสดงอย่างถูกต้องด้วยการรวมส่วนหัวและคอมไพเลอร์ไม่คัดค้าน การรวมกันของวัตถุเหล่านี้คืออะไรและไม่ปลอดภัยที่จะเชื่อมโยงเป็นไบนารีเดียว? ทำไม? แก้ไข: ยินดีต้อนรับคำตอบที่ครอบคลุมคอมไพเลอร์หลัก (เช่น gcc, clang, vs ++)
103 c++  c++11  linker  c++14  abi 

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