การปรับขนาดใน C ++ เป็นเรื่องที่ไม่สะดวกเนื่องจากอาจต้องเรียกตัวสร้างและตัวทำลาย
ฉันไม่คิดว่ามีเหตุผลพื้นฐานว่าทำไมใน C ++ คุณไม่มีตัวresize[]
ดำเนินการที่จะไปด้วยnew[]
และdelete[]
นั่นก็ทำสิ่งที่คล้ายกับสิ่งนี้:
newbuf = new Type[newsize];
std::copy_n(oldbuf, std::min(oldsize, newsize), newbuf);
delete[] oldbuf;
return newbuf;
เห็นได้ชัดว่าoldsize
จะถูกดึงมาจากสถานที่ลับเช่นเดียวกับที่อยู่ในdelete[]
และType
จะมาจากประเภทของตัวถูกดำเนินการ resize[]
จะล้มเหลวในกรณีที่ไม่สามารถคัดลอก Type ได้ซึ่งถูกต้องเนื่องจากไม่สามารถย้ายวัตถุดังกล่าวได้ สุดท้ายโค้ดด้านบนเริ่มต้นสร้างอ็อบเจ็กต์ก่อนกำหนดซึ่งคุณไม่ต้องการให้เป็นพฤติกรรมจริง
มีการเพิ่มประสิทธิภาพที่เป็นไปได้ที่newsize <= oldsize
จะเรียกตัวทำลายสำหรับอ็อบเจ็กต์ "เลยจุดสิ้นสุด" ของอาร์เรย์ที่สร้างใหม่และไม่ต้องทำอะไรเลย มาตรฐานจะต้องกำหนดว่าจำเป็นต้องมีการเพิ่มประสิทธิภาพนี้หรือไม่ (เช่นเมื่อคุณresize()
เป็นเวกเตอร์) อนุญาต แต่ไม่ระบุอนุญาต แต่ขึ้นอยู่กับการนำไปใช้งานหรือห้าม
คำถามที่คุณควรถามตัวเองก็คือ "การให้สิ่งนี้มีประโยชน์จริงvector
หรือไม่เนื่องจากยังทำเช่นนั้นและได้รับการออกแบบมาโดยเฉพาะเพื่อจัดเตรียมคอนเทนเนอร์ที่สามารถปรับขนาดได้ (ของหน่วยความจำที่ต่อเนื่องกัน - ข้อกำหนดนั้นละไว้ใน C ++ 98 แต่ แก้ไขใน C ++ 03) ที่เหมาะสมกว่าอาร์เรย์ด้วยวิธีการทำ C ++? "
ฉันคิดว่าคำตอบนั้นคิดกันอย่างกว้างขวางว่า "ไม่" หากคุณต้องการทำบัฟเฟอร์ที่ปรับขนาดได้ด้วยวิธี C ให้ใช้malloc / free / realloc
ซึ่งมีอยู่ใน C ++ หากคุณต้องการทำบัฟเฟอร์ที่ปรับขนาดได้ด้วยวิธี C ++ ให้ใช้เวกเตอร์ (หรือdeque
ถ้าคุณไม่ต้องการพื้นที่จัดเก็บที่ต่อเนื่องกัน) อย่าพยายามผสมทั้งสองโดยใช้new[]
สำหรับบัฟเฟอร์ดิบเว้นแต่คุณจะใช้คอนเทนเนอร์แบบเวกเตอร์