Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ฟังก์ชัน emplace() ของ deque ใน C++ STL

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()
  • เพิ่ม f suffix สำหรับ float literal ถ้าจำเป็น

ความแตกต่าง emplace() vs insert(): emplace() สร้างออบเจ็กต์ในที่ (in-place) โดยส่ง arguments ให้ constructor โดยตรง ในขณะที่ insert() ต้องมีออบเจ็กต์สร้างเสร็จแล้ว (อาจต้อง copy/move) สำหรับชนิดข้อมูลพื้นฐาน (int, char) ผลลัพธ์เหมือนกัน แต่สำหรับ class ที่มี constructor ซับซ้อน emplace() จะมีประสิทธิภาพดีกว่า