C ++ แปลงเวกเตอร์ <int> เป็นเวกเตอร์ <คู่>


96

เป็นวิธีการทำความสะอาดที่ดีที่จะแปลงอะไรไปstd::vector<int> intVec std::vector<double> doubleVecหรือโดยทั่วไปแล้วในการแปลงเวกเตอร์สองประเภทที่เปลี่ยนแปลงได้?

คำตอบ:


170

ใช้ตัวstd::vectorสร้างช่วง:

std::vector<int> intVec;
std::vector<double> doubleVec(intVec.begin(), intVec.end());

คุณสามารถใช้std::copy(...)ฟังก์ชันนี้ได้หรือไม่? คุณช่วยเพิ่มคำตอบนั้นได้ไหม
Alan Turing

3
@Lex: copy(v_int.begin(), v_int.end(), back_inserter(v_float));หรือv_float.resize(v_int.size()); copy(v_int.begin(), v_int.end(), v_float.begin());
Jon Purdy

1
เป็นความคิดที่ไม่ดีเนื่องจากเวอร์ชันตัวสร้างจะกำหนดเวกเตอร์ไว้ล่วงหน้าโดยใช้หมวดหมู่ตัววนซ้ำเพื่อสังเกตว่าสิ่งเหล่านี้เป็นตัวทำซ้ำการเข้าถึงโดยสุ่มจากนั้นจะสงวนพื้นที่ให้เพียงพอ การปรับขนาดก่อนคัดลอกเป็นการเริ่มต้นที่สิ้นเปลืองเป็นศูนย์
Michael Goldshteyn

1
@MichaelGoldshteyn ฉันไม่เข้าใจ - ถ้าคุณไม่ได้ระบุขนาดไว้ล่วงหน้ามันจะถูกปรับขนาดโดยอัตโนมัติเมื่อใดก็ตามที่ความจุเกิน (ซึ่งจะคัดลอกองค์ประกอบทั้งหมดซ้ำแล้วซ้ำเล่า) โอเคนี่คือเวลาเชิงเส้นที่ตัดจำหน่าย แต่ฉันพนันได้เลยว่ามันยังช้ากว่าการเริ่มต้น 0 ครั้งเดียว ฉันคิดถึงข้อโต้แย้งของคุณหรือเปล่า?
Algoman

2
@Algoman ดูstd::distance()"ถ้าเป็นตัวทำซ้ำการเข้าถึงโดยสุ่มฟังก์ชันจะใช้ตัวดำเนินการเพื่อคำนวณสิ่งนี้มิฉะนั้นฟังก์ชันจะใช้ตัวดำเนินการเพิ่ม (ตัวดำเนินการ ++) ซ้ำ ๆ " ดังนั้นในกรณีนี้จำนวนขององค์ประกอบสามารถพบได้โดยการลบตัววนซ้ำ ว่าไลบรารีมาตรฐานถูกนำไปใช้เพื่อใช้ std :: distance สำหรับการสำรองเริ่มต้น () หรือไม่ก็เป็นอีกคำถามหนึ่ง แต่อย่างน้อยgodbolt.org/z/6mcUFhก็มีการเรียกใช้ std :: distance ()
user1556435
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.