วิธีที่ง่ายที่สุดในการแปลงอาร์เรย์เป็นเวกเตอร์คืออะไร?
void test(vector<int> _array)
{
...
}
int x[3]={1, 2, 3};
test(x); // Syntax error.
ฉันต้องการแปลง x จากอาร์เรย์ int เป็นเวกเตอร์ด้วยวิธีที่ง่ายที่สุด
วิธีที่ง่ายที่สุดในการแปลงอาร์เรย์เป็นเวกเตอร์คืออะไร?
void test(vector<int> _array)
{
...
}
int x[3]={1, 2, 3};
test(x); // Syntax error.
ฉันต้องการแปลง x จากอาร์เรย์ int เป็นเวกเตอร์ด้วยวิธีที่ง่ายที่สุด
คำตอบ:
ใช้ตัวvector
สร้างที่ใช้ตัวทำซ้ำสองตัวโปรดทราบว่าพอยน์เตอร์เป็นตัวทำซ้ำที่ถูกต้องและใช้การแปลงโดยปริยายจากอาร์เรย์เป็นพอยน์เตอร์:
int x[3] = {1, 2, 3};
std::vector<int> v(x, x + sizeof x / sizeof x[0]);
test(v);
หรือ
test(std::vector<int>(x, x + sizeof x / sizeof x[0]));
sizeof x / sizeof x[0]
เห็นได้ชัดว่าอยู่ที่ไหน3
ในบริบทนี้ เป็นวิธีทั่วไปในการรับจำนวนองค์ประกอบในอาร์เรย์ สังเกตว่าx + sizeof x / sizeof x[0]
ชี้องค์ประกอบหนึ่งนอกเหนือจากองค์ประกอบสุดท้าย
sizeof x / sizeof x[0] == std::extent<decltype(x)>::value
โดยส่วนตัวแล้วฉันค่อนข้างชอบแนวทาง C ++ 2011 เพราะไม่ต้องการให้คุณใช้sizeof()
หรือจำการปรับขอบเขตอาร์เรย์หากคุณเคยเปลี่ยนขอบเขตอาร์เรย์ (และคุณสามารถกำหนดฟังก์ชันที่เกี่ยวข้องใน C ++ 2003 ได้หากต้องการเช่นกัน ):
#include <iterator>
#include <vector>
int x[] = { 1, 2, 3, 4, 5 };
std::vector<int> v(std::begin(x), std::end(x));
เห็นได้ชัดว่าด้วย C ++ 2011 คุณอาจต้องการใช้รายการ initializer ต่อไป:
std::vector<int> v({ 1, 2, 3, 4, 5 });
std::vector<T>
เป็นเจ้าของT
วัตถุเสมอ สิ่งนี้มีสองนัย: เมื่อแทรกวัตถุลงในเวกเตอร์พวกเขาจะถูกคัดลอกและถูกจัดวางในหน่วยความจำ สำหรับวัตถุที่มีขนาดเล็กพอสมควรเช่นลำดับของสตริงสั้น ๆ การจัดระเบียบเป็นการเพิ่มประสิทธิภาพที่สำคัญ หากวัตถุของคุณมีขนาดใหญ่และมีราคาแพงในการคัดลอกคุณอาจต้องการจัดเก็บ [อย่างใดอย่างหนึ่งทรัพยากรที่มีการจัดการ] ชี้ไปที่วัตถุ แนวทางใดจะมีประสิทธิภาพมากกว่านั้นขึ้นอยู่กับวัตถุ แต่คุณมีทางเลือก
พอยน์เตอร์สามารถใช้งานได้เหมือนกับตัวทำซ้ำอื่น ๆ :
int x[3] = {1, 2, 3};
std::vector<int> v(x, x + 3);
test(v)
const size_t X_SIZE = 3;
สำหรับแสดงขนาดอาร์เรย์หรือคำนวณจาก sizeof ฉันละเว้นส่วนนั้นเพื่อประโยชน์ในการอ่าน
คุณกำลังถามคำถามผิดที่นี่แทนที่จะบังคับให้ทุกอย่างเป็นเวกเตอร์ให้ถามว่าคุณจะแปลงการทดสอบให้ทำงานกับตัวทำซ้ำแทนคอนเทนเนอร์ที่เฉพาะเจาะจงได้อย่างไร คุณสามารถให้โอเวอร์โหลดได้เช่นกันเพื่อรักษาความเข้ากันได้ (และจัดการกับคอนเทนเนอร์อื่น ๆ ในเวลาเดียวกันได้ฟรี):
void test(const std::vector<int>& in) {
// Iterate over vector and do whatever
}
กลายเป็น:
template <typename Iterator>
void test(Iterator begin, const Iterator end) {
// Iterate over range and do whatever
}
template <typename Container>
void test(const Container& in) {
test(std::begin(in), std::end(in));
}
ซึ่งให้คุณทำ:
int x[3]={1, 2, 3};
test(x); // Now correct
( การสาธิตไอดีโอ )
วิธีง่ายๆวิธีหนึ่งคือการใช้assign()
ฟังก์ชันที่กำหนดไว้ล่วงหน้าในvector
คลาส
เช่น
array[5]={1,2,3,4,5};
vector<int> v;
v.assign(array, array+5); // 5 is size of array.
vector<int> a(5,10);
ค่าเฉลี่ยmake room for 5
int` แล้วและเริ่มต้นด้วย 10 แต่ x, x + ... ของคุณทำงานอย่างไร? คุณสามารถอธิบาย?