Stack ใน C++ STL คืออะไร?
Stack (สแต็ก) เป็นโครงสร้างข้อมูลที่จัดเก็บข้อมูลแบบ LIFO (Last In First Out) ซึ่งหมายถึงข้อมูลที่เข้าไปทีหลังจะถูกนำออกมาใช้ก่อน การเพิ่ม (push) และการนำออก (pop) ข้อมูลจะเกิดขึ้นที่ด้านบนสุดของสแต็กเท่านั้น คล้ายกับการซ้อนจาน หากต้องการเพิ่มจานใหม่ จะวางไว้ด้านบน และหากต้องการนำจานออก ก็จะนำจากด้านบนเช่นกัน
ฟังก์ชัน stack::emplace() คืออะไร?
ฟังก์ชัน stack::emplace() เป็นฟังก์ชันในตัว (built-in) ของ C++ STL ซึ่งประกาศอยู่ในไฟล์ header <stack> ฟังก์ชันนี้ใช้สำหรับสร้างและแทรกองค์ประกอบใหม่เข้าไปใน container สแต็กโดยตรง
เมื่อเรียกใช้ฟังก์ชันนี้ จะมีการแทรกองค์ประกอบใหม่ไว้ที่ด้านบนสุดของสแต็ก และทำให้องค์ประกอบที่เพิ่งแทรกเข้าไปกลายเป็นองค์ประกอบบนสุด (top element) ฟังก์ชันนี้จะเรียกใช้ emplace_back ภายในเพื่อแทรกองค์ประกอบใหม่ที่ด้านบน
รูปแบบไวยากรณ์ (Syntax)
stack_name.emplace(Args& args);
พารามิเตอร์
- args - อาร์กิวเมนต์ที่ต้องการนำไปสร้างและแทรกเข้าไปในสแต็ก
ค่าที่ส่งคืน (Return Value)
ฟังก์ชันนี้ไม่ส่งค่าอะไรกลับ (void)
ตัวอย่างการใช้งาน
ตัวอย่างที่ 1: การใช้งานพื้นฐาน
#include <iostream>
#include <stack>
using namespace std;
int main() {
stack<int> stck;
stck.emplace(10);
stck.emplace(20);
stck.emplace(30);
stck.emplace(40);
stck.emplace(50);
stck.emplace(60);
cout << "Elements in stack are: ";
while (!stck.empty()) {
cout << stck.top() << " ";
stck.pop();
}
return 0;
}
ผลลัพธ์
Elements in stack are: 60 50 40 30 20 10
ตัวอย่างที่ 2: นับจำนวนองค์ประกอบในสแต็ก
#include <iostream>
#include <stack>
using namespace std;
int main() {
stack<int> stck;
int total = 0;
stck.emplace(10);
stck.emplace(20);
stck.emplace(30);
stck.emplace(40);
stck.emplace(50);
stck.emplace(60);
cout << "Elements in stack are: ";
while (!stck.empty()) {
cout << stck.top() << " ";
stck.pop();
total++;
}
cout << "\nTotal number of elements in stack are: " << total;
return 0;
}
ผลลัพธ์
Elements in stack are: 60 50 40 30 20 10 Total number of elements in stack are: 6
สรุป
ฟังก์ชัน emplace() มีประสิทธิภาพมากกว่า push() ในบางกรณี เนื่องจากสร้างออบเจ็กต์โดยตรงในหน่วยความจำของ container (in-place construction) แทนที่จะสร้างแล้วคัดลอกหรือย้าย ซึ่งลด overhead การคัดลอกออบเจ็กต์ได้ โดยเฉพาะเมื่อทำงานกับออบเจ็กต์ที่มี constructor ซับซ้อน