มีคำตอบมากมายที่นี่และทุกคนจะได้งานทำ
อย่างไรก็ตามมีคำแนะนำที่ทำให้เข้าใจผิด!
นี่คือตัวเลือก:
vector<int> dataVec;
int dataArray[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
unsigned dataArraySize = sizeof(dataArray) / sizeof(int);
// Method 1: Copy the array to the vector using back_inserter.
{
copy(&dataArray[0], &dataArray[dataArraySize], back_inserter(dataVec));
}
// Method 2: Same as 1 but pre-extend the vector by the size of the array using reserve
{
dataVec.reserve(dataVec.size() + dataArraySize);
copy(&dataArray[0], &dataArray[dataArraySize], back_inserter(dataVec));
}
// Method 3: Memcpy
{
dataVec.resize(dataVec.size() + dataArraySize);
memcpy(&dataVec[dataVec.size() - dataArraySize], &dataArray[0], dataArraySize * sizeof(int));
}
// Method 4: vector::insert
{
dataVec.insert(dataVec.end(), &dataArray[0], &dataArray[dataArraySize]);
}
// Method 5: vector + vector
{
vector<int> dataVec2(&dataArray[0], &dataArray[dataArraySize]);
dataVec.insert(dataVec.end(), dataVec2.begin(), dataVec2.end());
}
ในการตัดเรื่องสั้นขนาดยาววิธีที่ 4 โดยใช้ vector :: insert เป็นวิธีที่ดีที่สุดสำหรับสถานการณ์ของ bsruth
นี่คือรายละเอียดบางส่วนที่เต็มไปด้วยเลือด:
วิธีที่ 1น่าจะเข้าใจง่ายที่สุด เพียงแค่คัดลอกแต่ละองค์ประกอบจากอาร์เรย์แล้วดันเข้าไปที่ด้านหลังของเวกเตอร์ อนิจจามันช้า เนื่องจากมีการวนซ้ำ (โดยนัยกับฟังก์ชันการคัดลอก) แต่ละองค์ประกอบจึงต้องได้รับการปฏิบัติทีละรายการ ไม่มีการปรับปรุงประสิทธิภาพใด ๆ จากการที่เรารู้ว่าอาร์เรย์และเวกเตอร์เป็นบล็อกที่อยู่ติดกัน
วิธีที่ 2เป็นการปรับปรุงประสิทธิภาพที่แนะนำสำหรับวิธีที่ 1 เพียงจองขนาดของอาร์เรย์ไว้ล่วงหน้าก่อนเพิ่ม สำหรับอาร์เรย์ขนาดใหญ่สิ่งนี้อาจช่วยได้ อย่างไรก็ตามคำแนะนำที่ดีที่สุดคือห้ามใช้เงินสำรองเว้นแต่การทำโปรไฟล์จะแนะนำว่าคุณอาจได้รับการปรับปรุง (หรือคุณต้องตรวจสอบให้แน่ใจว่าตัวทำซ้ำของคุณจะไม่ถูกยกเลิก) Bjarne ตกลง บังเอิญฉันพบว่าวิธีนี้ทำงานช้าที่สุดเกือบตลอดเวลาแม้ว่าฉันจะพยายามอธิบายอย่างละเอียดว่าทำไมมันถึงช้ากว่าวิธีที่ 1 เป็นประจำอย่างมาก ...
วิธีที่ 3เป็นวิธีแก้ปัญหาของโรงเรียนเก่า - โยน C ไปที่ปัญหา! ทำงานได้ดีและรวดเร็วสำหรับประเภท POD ในกรณีนี้จำเป็นต้องเรียกการปรับขนาดเนื่องจาก memcpy ทำงานนอกขอบเขตของเวกเตอร์และไม่มีวิธีใดที่จะบอกเวกเตอร์ว่าขนาดของมันเปลี่ยนไป นอกเหนือจากการแก้ปัญหาที่น่าเกลียด (การคัดลอกไบต์!) โปรดจำไว้ว่าสิ่งนี้สามารถใช้ได้กับประเภท PODเท่านั้น ฉันจะไม่ใช้วิธีนี้
วิธีที่ 4เป็นวิธีที่ดีที่สุด ความหมายชัดเจน (โดยปกติ) เร็วที่สุดและใช้ได้กับวัตถุใด ๆ ไม่มีข้อเสียในการใช้วิธีนี้สำหรับแอปพลิเคชันนี้
วิธีที่ 5คือการปรับแต่งวิธีที่ 4 - คัดลอกอาร์เรย์เป็นเวกเตอร์แล้วต่อท้าย ตัวเลือกที่ดี - โดยทั่วไปรวดเร็วและชัดเจน
สุดท้ายนี้คุณทราบว่าคุณสามารถใช้เวกเตอร์แทนอาร์เรย์ได้ใช่ไหม? แม้ว่าฟังก์ชันจะคาดหวังอาร์เรย์สไตล์ c คุณสามารถใช้เวกเตอร์ได้:
vector<char> v(50); // Ensure there's enough space
strcpy(&v[0], "prefer vectors to c arrays");
หวังว่าจะช่วยใครบางคนที่นั่น!