Chuyển tới nội dung chính

std::stack::push

#include <stack>

void push(const value_type& val); // (1)
void push(value_type&& val); // (2) (since C++11)

Thêm một phần tử mới vào đỉnh của std::stack.

Tham số

val

  • Giá trị của phần tử cần thêm vào đỉnh std::stack.
  • Phiên bản (1) nhận tham chiếu hằng (const value_type&), cho phép truyền vào một đối tượng đã tồn tại. Đối tượng sẽ được sao chép (copy) vào std::stack.
  • Phiên bản (2) (từ C++11) nhận tham chiếu rvalue (value_type&&), cho phép di chuyển (move) đối tượng vào std::stack nếu val là một rvalue, tránh việc sao chép không cần thiết, tối ưu hiệu suất.

Giá trị trả về

Không có giá trị trả về

Đặc điểm

  1. Thêm phần tử vào đỉnh: push() luôn thêm phần tử mới vào đỉnh std::stack.
  2. Tăng kích thước: push() làm tăng kích thước của std::stack lên 1.
  3. Hỗ trợ copy và move: Phiên bản (1) thực hiện sao chép phần tử được truyền vào. Phiên bản (2) (từ C++11) hỗ trợ di chuyển (move semantics), giúp tối ưu hiệu suất khi thêm các đối tượng lớn hoặc phức tạp vào std::stack.
  4. Dựa trên underlying container: push() của std::stack thực chất gọi hàm push_back() (đối với std::deque, std::list) hoặc push_back() (đối với std::vector) của underlying container.
  5. Có thể ném ngoại lệ: Nếu việc cấp phát bộ nhớ cho phần tử mới thất bại, push() có thể ném ra ngoại lệ std::bad_alloc. Ngoài ra, nếu copy constructor (phiên bản 1) hoặc move constructor (phiên bản 2) của value_type ném ngoại lệ, push() cũng sẽ ném ngoại lệ.
  6. Độ phức tạp: Độ phức tạp của push()O(1) - thời gian hằng số (amortized). Thao tác này thường rất nhanh vì nó chỉ liên quan đến việc cập nhật con trỏ đỉnh của stack.

Ví dụ

#include <iostream>
#include <stack>

int main() {
std::stack<int> mystack;

mystack.push(10); // Thêm 10 vào đỉnh stack
mystack.push(20); // Thêm 20 vào đỉnh stack
mystack.push(30); // Thêm 30 vào đỉnh stack

std::cout << "Top element: " << mystack.top() << '\n'; // Output: Top element: 30

return 0;
}

Move semantics

#include <iostream>
#include <stack>
#include <string>

int main() {
std::stack<std::string> mystack;

std::string str = "Hello";
mystack.push(str); // Sao chép str vào mystack
mystack.push(std::move(str)); // Di chuyển str vào mystack (str sẽ trở thành rỗng sau lời gọi này)
mystack.push("World"); // Tạo một đối tượng string tạm thời và di chuyển nó vào mystack

std::cout << "Top element: " << mystack.top() << '\n'; // Output: Top element: World
std::cout << "str after move: " << str << '\n'; // Output: str after move: (empty string)

return 0;
}

Các hàm liên quan

popXóa phần tử ở đỉnh của std::stack
sizeTrả về số lượng phần tử hiện có trong std::stack