2016-09-10 22 views
8

Tôi đã quen với giao diện hiện tại của std::map.
Chèn các phần tử trả về một bool mô tả chèn thành công,
cũng như trình lặp là vị trí phần tử được chèn vào.Khi nào tôi sử dụng node_type với std :: map :: insert?

template< class P > 
std::pair<iterator,bool> insert(P&& value); //(since C++11) 

C++ 17 cho biết thêm những gì có vẻ là một cuộc gọi tương tự, nhưng với những cái tên kiểu khác nhau:

insert_return_type insert(node_type&& nh); //(since C++17) 

tôi đã cố gắng tìm ra một node_type là gì, nhưng nó là chủ yếu chỉ định:

template</*unspecified*/> 
class /*unspecified*/ 

Tại sao chức năng này được thêm vào C++ 17 và khi nào tôi sẽ sử dụng chức năng này trong cuộc gọi cũ?

Trả lời

7

Nó không chỉ std::map, chức năng tương tự đã được thêm vào tất cả các kết hợp và container kết hợp có thứ tự. Họ được giải thích trong tiêu chuẩn trong [container.node]/1

Một tay cầm nút là một đối tượng chấp nhận quyền sở hữu của một yếu tố duy nhất từ ​​một container kết hợp (23.2.4) hoặc một container kết hợp có thứ tự (23.2.5). Nó có thể được sử dụng để chuyển quyền sở hữu đó sang một vùng chứa khác với các nút tương thích. Các vùng chứa có các nút tương thích có cùng loại xử lý nút. ...

Bảng sau đây cho thấy các vùng chứa có nút tương thích.

Giao diện xử lý nút cho phép bạn thực hiện là chuyển các phần tử (nút) từ một vùng chứa này sang vùng chứa khác (tương thích) mà không phải sao chép/di chuyển các phần tử. Thay vào đó, các nút bên trong riêng lẻ được duy trì bởi vùng chứa được chuyển toàn bộ.

Điều này trở nên cần thiết khi giao dịch với vùng chứa chứa loại không thể sao chép, không thể di chuyển được.

5

Bạn có thể lấy nút từ std::map bằng chức năng extract() của nó. Sau đó, bạn có thể đặt nút đó vào một bản đồ khác (hoặc vào cùng một bản đồ sau khi thay đổi khóa của nó).

node_type extract(const_iterator position); (1) (since C++17) 
node_type extract(const key_type& x);  (2) (since C++17) 

1) hủy liên kết nút có chứa nguyên tố này được trỏ đến bởi vị trí và trả về một tay cầm nút đó sở hữu nó
2) Nếu container có một yếu tố với trọng tương đương để x, hủy liên kết các nút chứa phần tử đó từ vùng chứa và trả về một nút xử lý sở hữu nó. Nếu không, trả về một nút điều khiển rỗng.

Trong cả hai trường hợp, không có yếu tố này được sao chép hoặc di chuyển, chỉ có con trỏ bên trong của các nút container đang repointed (tái cân bằng có thể xảy ra, như với erase()) Trích xuất một nút làm mất hiệu lực lặp để các yếu tố chiết xuất . Con trỏ và tham chiếu đến phần tử được trích xuất vẫn hợp lệ, nhưng không thể được sử dụng trong khi phần tử thuộc sở hữu của nút điều khiển : chúng có thể sử dụng được nếu phần tử được chèn vào vùng chứa .

Ví dụ:

map<int, string> m{{1,”mango”}, {2,”papaya”}, {3,”guava”}}; 
auto nh = m.extract(2); 
nh.key() = 4; 
m.insert(move(nh)); 
// m == {{1,”mango”}, {3,”guava”}, {4,”papaya”}} 
Các vấn đề liên quan