std::deque::emplace_back
#include <deque>
template <class... Args>
void emplace_back(Args&&... args);
Xây dựng một phần tử mới trực tiếp tại cuối deque, tránh việc sao chép hoặc di chuyển không cần thiết.
Tham số
args
- Danh sách các đối số (có thể trống) được sử dụng để khởi tạo phần tử mới. Các đối số này sẽ được truyền đến constructor của kiểu phần tử
value_type
của deque.
Giá trị trả về
Không có giá trị trả về
Đặc điểm
emplace_back()
tạo phần tử mới trực tiếp trong bộ nhớ của deque tại vị trí cuối cùng, tránh việc tạo ra các đối tượng tạm thời không cần thiết, tối ưu hiệu suất.- Bằng cách xây dựng phần tử tại chỗ,
emplace_back()
giúp tránh việc sao chép (copy) hoặc di chuyển (move) các đối tượng, đặc biệt hiệu quả khi làm việc với các đối tượng lớn hoặc phức tạp. emplace_back()
sử dụng variadic template (Args&&... args), cho phép nó nhận số lượng đối số tùy ý, phù hợp với constructor của kiểu phần tử.- Khi chèn phần tử mới vào cuối deque bằng
emplace_back()
, các phần tử đã tồn tại trong deque giữ nguyên vị trí. push_back()
sẽ tạo bản sao hoặc di chuyển phần tử được truyền vào trong khi đóemplace_back()
sẽ xây dựng phần tử tại chỗ trong deque, cho phép dùngemplace_back()
ngay cả khi kiểu phần tử không hỗ trợ copy/move constructor.- Độ phức tạp: Độ phức tạp của
emplace_back()
làO(1)
- thời gian hằng số, giống nhưpush_back()
.
Ví dụ
#include <iostream>
#include <deque>
#include <string>
int main() {
std::deque<std::pair<int, std::string>> myDeque;
// Thêm một phần tử mới vào cuối deque, sử dụng emplace_back()
myDeque.emplace_back(10, "Hello");
// Thêm một phần tử mới vào cuối deque, sử dụng emplace_back()
myDeque.emplace_back(20, "World");
// In ra các phần tử trong deque
std::cout << "myDeque:";
for (const auto& p : myDeque) {
std::cout << " (" << p.first << ", " << p.second << ")";
}
std::cout << '\n'; // Output: myDeque: (10, Hello) (20, World)
return 0;
}
Với class không hỗ trợ copy/move constructor
#include <iostream>
#include <deque>
class NonCopyable {
public:
NonCopyable(int val) : data(val) {}
NonCopyable(const NonCopyable&) = delete;
NonCopyable& operator=(const NonCopyable&) = delete;
// Move constructor/assignment are not necessary but good practice
NonCopyable(NonCopyable&&) = default;
NonCopyable& operator=(NonCopyable&&) = default;
int data;
};
int main() {
std::deque<NonCopyable> myDeque;
// myDeque.push_back(NonCopyable(10)); // Error: Copy constructor is deleted
myDeque.emplace_back(10); // OK: Constructs the element in-place
myDeque.emplace_back(20); // OK: Constructs the element in-place
std::cout << "myDeque:";
for (const auto& obj : myDeque) {
std::cout << " " << obj.data;
}
std::cout << '\n'; // Output: myDeque: 10 20
return 0;
}
Các hàm liên quan
emplace_front | Xây dựng một phần tử mới trực tiếp tại đầu deque |
push_back | Thêm một phần tử mới vào cuối deque |
emplace | Xây dựng một phần tử mới trực tiếp tại một vị trí cụ thể trong deque |
erase | Xóa một hoặc nhiều phần tử khỏi deque tại một vị trí cụ thể hoặc trong một phạm vi |
assign | Gán các phần tử mới cho deque, thay thế nội dung hiện tại của nó |