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

std::priority_queue::push

#include <queue>

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 std::priority_queue. Phần tử mới sẽ được sắp xếp vào vị trí thích hợp dựa trên độ ưu tiên của nó.

Tham số

val

  • Giá trị của phần tử cần thêm vào cuối std::priority_queue.
  • 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::priority_queue.
  • 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::priority_queue 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à duy trì thứ tự ưu tiên: push() thêm phần tử mới vào std::priority_queue và tự động sắp xếp lại các phần tử để đảm bảo phần tử có độ ưu tiên cao nhất luôn ở đầu queue.
  2. Tăng kích thước: push() làm tăng kích thước của std::priority_queue 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.
  4. Dựa trên underlying container và hàm so sánh: push() của std::priority_queue sử dụng các hàm của underlying container (ví dụ: push_back() của std::vector) và hàm so sánh để sắp xếp phần tử.
  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(log n), với n là số phần tử trong std::priority_queue. Việc thêm phần tử cần phải duy trì cấu trúc heap của priority queue.

Ví dụ

#include <iostream>
#include <queue>

int main() {
std::priority_queue<int> mypq;

mypq.push(30);
mypq.push(10);
mypq.push(50);
mypq.push(20);

std::cout << "mypq after pushes:";
while (!mypq.empty()) {
std::cout << ' ' << mypq.top(); // Output: 50 30 20 10
mypq.pop();
}
std::cout << '\n';

return 0;
}

Move semantics:

#include <iostream>
#include <queue>
#include <string>

int main() {
std::priority_queue<std::string> mypq;

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

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ử có độ ưu tiên cao nhất (phần tử ở đỉnh) của std::priority_queue
sizeTrả về số lượng phần tử hiện có trong std::priority_queue