2010-02-22 33 views
12

Tôi có cấu trúc bản đồ sau đây: map < pair < int,int >, object* > và tôi muốn chèn vào đó.Cách chèn cặp vào bản đồ

Làm cách nào để thực hiện điều này vì tôi đang cố gắng chèn một cặp và một đối tượng và tôi phải tạo một cặp trong số này?

Tôi có nên tạo cặp mới bằng cách sử dụng make_pair() ngoài cặp và đối tượng mà tôi có không? Nếu vậy, bạn có thể vui lòng cho tôi biết cách thực hiện điều này không?

+5

Bạn đã thử mã nào? – Mark

Trả lời

20
object * myObject = // get an object somehow 
myMap.insert(std::make_pair(std::make_pair(1,2), myObject)); 

hoặc

typedef map<pair<int, int>, object *> MapType; 
object * myObject = // get an object somehow 
myMap.insert(MapType::value_type(std::make_pair(1,2), myObject)); 
+0

Tôi đã sử dụng đề xuất đầu tiên của bạn - đẹp và súc tích. Cám ơn rất nhiều! – Myx

+2

Nếu bạn đang sử dụng rất nhiều trong mã của bạn, bạn có thể muốn bọc bản đồ lên trong một lớp với một hàm chèn (cặp, đối tượng) để dễ đọc. –

1

Có hai cách:

typedef std::map<int,Object> map_t; 
map_t map; 
Object obj; 

std::pair<map_t::iterator, bool> result = map.insert(std::make_pair(1,obj)); // 1 

map[1] = obj; // 2 
  1. Chỉ hoạt động nếu phím không phải là đã hiện diện, những điểm iterator để cặp với giá trị chủ chốt và bool chỉ ra nếu nó được chèn vào hay không.

  2. dễ dàng hơn, nhưng nếu nó không tồn tại đối tượng được mặc định đầu tiên được xây dựng và sau đó được phân công thay vì là bản sao được xây dựng

Nếu bạn không phải lo lắng về hiệu suất, chỉ cần chọn bởi dù hay không bạn muốn xóa mục trước đó.

+0

Đúng, nhưng câu hỏi được hỏi về bản đồ có loại khóa cũng là một cặp. –

+0

Tôi không thấy sự phụ thuộc. 'sed s/1/std :: make_pair (1,1)/g' và một' map_t' được định nghĩa phù hợp. Nó không thay đổi ý kiến ​​hay bất cứ điều gì, tôi chỉ muốn chứng minh với các khái niệm đơn giản để giúp tập trung vào các điểm quan trọng hơn là ẩn chúng trong đám đông. –

10

Giả sử bạn đang sử dụng C++ 11 hoặc mới hơn, phương pháp tốt nhất có lẽ là:

object * myObject = // get an object somehow 
myMap.emplace({1,2}, myObject); 

Đối với bản đồ, emplace có thể được coi như một phiên bản của insert mà sẽ đưa chìa khóa và giá trị riêng biệt các đối số (nó thực sự có thể lấy bất kỳ sự kết hợp nào của các đối số mà các hàm tạo của loại tương ứng pair có thể mất). Ngoài việc gọn gàng về cú pháp, nó cũng có khả năng hiệu quả hơn make_pair, bởi vì make_pair thường sẽ tạo ra một đầu ra có loại không khớp chính xác với số value_type của vùng chứa và do đó nó phải chuyển đổi loại không cần thiết.

Tôi từng đề nghị này, mà cũng chỉ hoạt động trong C++ 11 hoặc sau này:

object * myObject = // get an object somehow 
myMap.insert({{1,2}, myObject}); 

Điều này tránh việc sử dụng hơi đáng ngạc nhiên của emplace, nhưng nó trước đây không hoạt động nếu khóa hoặc giá trị loại chỉ di chuyển (ví dụ: unique_ptr). Điều đó đã được khắc phục trong tiêu chuẩn, nhưng việc triển khai thư viện chuẩn của bạn có thể chưa được khắc phục. Điều này về mặt lý thuyết có thể kém hiệu quả hơn một chút, nhưng theo cách mà bất kỳ trình biên dịch nửa chừng nào cũng có thể dễ dàng tối ưu hóa.

+0

Tôi nghĩ rằng câu trả lời offi cial và điều này nên được sáp nhập dựa trên các tiêu chí phiên bản trình biên dịch – Aviv

Các vấn đề liên quan