Deque คืออะไร?
Deque (Double Ended Queue) เป็นคอนเทนเนอร์แบบลำดับที่ให้ฟังก์ชันการขยายและหดตัวได้ที่ ทั้งสองปลาย** แตกต่างจาก queue ปกติที่แทรกได้แค่ท้าย (END) และลบได้แค่หน้า (FRONT) ใน deque สามารถแทรกและลบได้ทั้งสองด้าน
deque::emplace() คืออะไร?
deque::emplace() ใช้สำหรับ สร้างและแทรกองค์ประกอบใหม่ เข้าไปใน deque ก่อนตำแหน่งที่ระบุ (position) และเพิ่มขนาดของ deque ตามขนาดขององค์ประกอบที่แทรก ฟังก์ชันนี้แตกต่างจาก insert() ที่ emplace() จะสร้างออบเจ็กต์โดยตรงในหน่วยความจำ (in-place construction) หลีกเลี่ยงการคัดลอกหรือย้าย (copy/move) ที่ไม่จำเป็น
ไวยากรณ์ (Syntax)
iterator emplace(const_iterator position, Args&&... args);
พารามิเตอร์ (Parameters)
- position - ตำแหน่งในคอนเทนเนอร์ที่จะแทรกองค์ประกอบใหม่ (iterator)
- args - อาร์กิวเมนต์สำหรับสร้าง (construct) องค์ประกอบใหม่
ค่าที่ส่งคืน (Return Value)
ส่งคืน iterator ที่ชี้ไปยังองค์ประกอบที่แทรกใหม่
ตัวอย่างการทำงาน
Input: Deque: 96 97 98 100 Output: Deque ใหม่หลังแทรก 99: 96 97 98 99 100 Input: Deque: C P T A I N Output: Deque ใหม่หลังแทรก A: C A P T A I N
ตัวอย่างโค้ดที่แก้ไขแล้ว (โค้ดต้นฉบับมีข้อผิดพลาดมาก)
// C++ code to demonstrate the working of deque emplace() function
#include <deque>
#include <iostream>
using namespace std;
int main() {
// กำหนดค่าเริ่มต้น deque
deque<int> dq = {85, 87, 88, 89, 90};
// พิมพ์ deque ก่อน
cout << "Deque: ";
for (auto x = dq.begin(); x != dq.end(); ++x)
cout << *x << " ";
// ใช้ emplace() แทรก 86 ระหว่าง 85 และ 87 (ตำแหน่ง begin() + 1)
auto it = dq.emplace(dq.begin() + 1, 86);
// พิมพ์ deque หลังแทรก
cout << "\nDeque ใหม่: ";
for (auto x = dq.begin(); x != dq.end(); ++x)
cout << *x << " ";
cout << "\nองค์ประกอบที่แทรก: " << *it;
return 0;
}
ผลลัพธ์ (Output)
Deque: 85 87 88 89 90 Deque ใหม่: 85 86 87 88 89 90 องค์ประกอบที่แทรก: 86
ตัวอย่างที่ 2: แทรกตัวอักษร
#include <deque>
#include <iostream>
using namespace std;
int main() {
deque<char> dq = {'L', 'A', 'C', 'K'};
cout << "Deque: ";
for (auto x = dq.begin(); x != dq.end(); ++x)
cout << *x << " ";
// แทรก 'B' ที่ตำแหน่ง begin() + 1 (หลัง 'L')
auto it = dq.emplace(dq.begin() + 1, 'B');
cout << "\nDeque ใหม่: ";
for (auto x = dq.begin(); x != dq.end(); ++x)
cout << *x << " ";
return 0;
}
ผลลัพธ์ (Output)
Deque: L A C K Deque ใหม่: L B A C K
แก้ไขข้อผิดพลาดจากโค้ดต้นฉบับ:
- ใช้
#include <deque>และ#include <iostream>แทน .h แบบเก่า - แก้ไข
deque<int> iterator x;ซึ่งเป็น syntax ผิด → ใช้auto it = dq.emplace(...) - แก้ไข
deque.emplace(deque.emplace() + 1, 85)ซึ่งเรียก emplace() ซ้ำและผิด logic → ใช้dq.begin() + 1 - แก้ไขลูปพิมพ์:
x >= deque.end()→x != dq.end() - เพิ่ม
fsuffix สำหรับ float literal ถ้าจำเป็น
ความแตกต่าง emplace() vs insert(): emplace() สร้างออบเจ็กต์ในที่ (in-place) โดยส่ง arguments ให้ constructor โดยตรง ในขณะที่ insert() ต้องมีออบเจ็กต์สร้างเสร็จแล้ว (อาจต้อง copy/move) สำหรับชนิดข้อมูลพื้นฐาน (int, char) ผลลัพธ์เหมือนกัน แต่สำหรับ class ที่มี constructor ซับซ้อน emplace() จะมีประสิทธิภาพดีกว่า