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

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

2
พฤติกรรมแปลก ๆ กับฟิลด์คลาสเมื่อเพิ่มไปยัง std :: vector
ฉันได้พบพฤติกรรมแปลก ๆ บางอย่าง (บนเสียงดังกราวและ GCC) ในสถานการณ์ต่อไปนี้ ฉันมีเวกเตอร์ที่มีองค์ประกอบหนึ่งซึ่งเป็นตัวอย่างของการเรียนnodes Nodeจากนั้นฉันเรียกฟังก์ชันnodes[0]ที่เพิ่มNodeเวกเตอร์ใหม่ เมื่อเพิ่มโหนดใหม่ฟิลด์ของวัตถุที่เรียกจะถูกรีเซ็ต! อย่างไรก็ตามพวกเขาดูเหมือนจะกลับสู่ปกติอีกครั้งเมื่อฟังก์ชั่นเสร็จสิ้น ฉันเชื่อว่านี่เป็นตัวอย่างที่ทำซ้ำได้น้อยที่สุด: #include <iostream> #include <vector> using namespace std; struct Node; vector<Node> nodes; struct Node{ int X; void set(){ X = 3; cout << "Before, X = " << X << endl; nodes.push_back(Node()); cout << "After, X = " << X …

6
การสลับเวกเตอร์สองตัวที่แตกต่างกันใน C ++ ใช้วิธี std :: vector :: swap ปลอดภัยหรือไม่?
สมมติว่าคุณมีรหัสต่อไปนี้: #include <iostream> #include <string> #include <vector> int main() { std::vector<std::string> First{"example", "second" , "C++" , "Hello world" }; std::vector<std::string> Second{"Hello"}; First.swap(Second); for(auto a : Second) std::cout << a << "\n"; return 0; } ลองนึกภาพเวกเตอร์ไม่ใช่std::stringยังคลาส: std::vector<Widget> WidgetVector; std::vector<Widget2> Widget2Vector; มันปลอดภัยไหมที่จะสลับสองเวกเตอร์ด้วยstd::vector::swapวิธีการ: WidgetVector.swap(Widget2Vector);หรือมันจะนำไปสู่ ​​UB?
30 c++  c++11  vector  stdvector  swap 

3
การเรียงลำดับเวกเตอร์ตามลำดับจากมากไปน้อยภายในสองช่วง
ว่าฉันมีเวกเตอร์จำนวนเต็ม: std::vector<int> indices; for (int i=0; i<15; i++) indices.push_back(i); จากนั้นฉันเรียงตามลำดับจากมากไปน้อย: sort(indices.begin(), indices.end(), [](int first, int second) -> bool{return indices[first] > indices[second];}) for (int i=0; i<15; i++) printf("%i\n", indices[i]); สิ่งนี้สร้างสิ่งต่อไปนี้: 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 ตอนนี้ฉันต้องการให้หมายเลข 3, 4, 5 และ 6 …

1
วิธีการที่ทันสมัยในการทำให้ std :: vector จัดสรรหน่วยความจำที่จัดตำแหน่งไว้
คำถามต่อไปนี้เป็นเรื่องที่เกี่ยวข้อง แต่คำตอบที่มีความเก่าแก่และความคิดเห็นจากผู้ใช้มาร์ค Glisseแสดงให้เห็นมีวิธีการใหม่ตั้งแต่ C ++ 17 เพื่อแก้ไขปัญหานี้ที่อาจจะไม่ได้รับการกล่าวถึงอย่างเพียงพอ ฉันกำลังพยายามให้หน่วยความจำที่ทำงานสอดคล้องกันอย่างถูกต้องสำหรับ SIMD ในขณะที่ยังคงสามารถเข้าถึงข้อมูลทั้งหมดได้ ใน Intel ถ้าฉันสร้างเวกเตอร์ลอยชนิด__m256และลดขนาดลง 8 เท่ามันจะทำให้ฉันมีหน่วยความจำที่สอดคล้องกัน เช่น std::vector<__m256> mvec_a((N*M)/8); ในทางที่แฮ็กเล็กน้อยฉันสามารถชี้พอยน์เตอร์ไปยังองค์ประกอบเวกเตอร์เพื่อลอยตัวซึ่งทำให้ฉันสามารถเข้าถึงค่าลอยตัวส่วนบุคคล แต่ฉันต้องการให้มีการstd::vector<float>จัดตำแหน่งที่ถูกต้องและสามารถโหลดลงใน__m256และ SIMD ประเภทอื่น ๆ ได้โดยไม่ต้องแบ่งไฟล์ ฉันได้รับการมองเข้าไปในaligned_alloc นี่สามารถให้อาเรย์แบบ C ที่จัดเรียงอย่างถูกต้อง: auto align_sz = static_cast<std::size_t> (32); float* marr_a = (float*)aligned_alloc(align_sz, N*M*sizeof(float)); อย่างไรก็ตามฉันไม่แน่ใจว่าจะทำเช่นนี้std::vector<float>ได้อย่างไร ให้std::vector<float>เป็นเจ้าของไม่ได้ดูเหมือนจะเป็นไปได้marr_a ฉันเคยเห็นคำแนะนำบางอย่างที่ฉันควรเขียนตัวจัดสรรแบบกำหนดเองแต่ดูเหมือนว่าจะทำงานได้มากและบางทีด้วย C ++ ที่ทันสมัยมีวิธีที่ดีกว่า
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.