2012-01-20 33 views
6

Tôi bắt đầu làm việc trên một dự án Objective-C++, cảm nhận cách tổng hợp hai ngôn ngữ cảm thấy trước khi tôi thực hiện bất kỳ thiết kế hạng nặng nào. Tôi rất hấp dẫn bởi cách tính toán tham chiếu tự động đã được tích hợp với C++: chúng tôi nhận được tương đương với con trỏ thông minh cho NSObjects xử lý lưu giữ/giải phóng chính xác trong các thùng chứa STL (xem bài viết của David Chisnall tại http://www.informit.com/articles/article.aspx?p=1745876&seqNum=3).Làm thế nào để sử dụng NSString làm khóa trong Objective-C++ std :: map

Tôi muốn sử dụng bản đồ STL làm ánh xạ an toàn từ NSStrings đến giá trị C++. Tôi có thể tuyên bố ánh xạ là

std::map<NSString*, MyType> mapping 

Với ARC, ánh xạ này xử lý việc quản lý bộ nhớ đúng cách. Nhưng nó không tuân theo NSString ngữ nghĩa giá trị đúng cách, bởi vì nó sử dụng so sánh con trỏ thay vì -[NSString compare:].

Cách tốt nhất để lấy bản đồ STL để sử dụng so sánh chuỗi thay vì so sánh con trỏ là gì?
Tôi có nên thử chuyên std::less<NSString*> không?
Tôi có nên khai báo một bộ so sánh rõ ràng như std::map<NSString*, MyType, MyCompare> không?
Tôi có nên bọc các phím NSString* trong con trỏ thông minh triển khai operator< không?

+0

làm thế nào để bạn xác định tốt nhất? bộ nhớ tốc độ kết quả mong muốn là gì? – madmik3

+0

Thú vị. Tôi không biết con trỏ objc sẽ hoạt động dễ dàng như thế nào với ARC. Nhìn vào bài viết của Chisnall, bạn sẽ phải thêm __weak hoặc __strong vào bản khai báo của bản đồ để nó hoạt động. Nếu không, chúng là POD và nó sẽ không hoạt động. (Tôi không có câu trả lời cho vấn đề so sánh kể từ khi tôi làm điều đó hiếm khi và quên mật khẩu. Tôi sẽ thử theo thứ tự bạn đã cung cấp.) – smparkes

+0

Tôi nghĩ rằng nếu con trỏ mạnh mẽ, bạn không cần phải đánh dấu chúng, chỉ khi họ yếu đuối. Dù sao, tôi sẽ đi với một so sánh rõ ràng. – bames53

Trả lời

9

Bạn muốn một đối tượng so sánh tùy chỉnh mà các cuộc gọi chức năng so sánh NSString của, một cái gì đó như thế này:

#include <functional> 
#include <map> 

struct CompareNSString: public std::binary_function<NSString*, NSString*, bool> { 
    bool operator()(NSString* lhs, NSString* rhs) const { 
     if (rhs != nil) 
      return (lhs == nil) || ([lhs compare: rhs] == NSOrderedAscending); 
     else 
      return false; 
    } 
}; 

std::map<NSString*, MyType, CompareNSString> mapping; 
+0

Cảm ơn mẹo! Ánh xạ hoạt động tốt với đối tượng so sánh. Tôi đã thay đổi điều kiện để sử dụng thứ tự nhất quán cho các nils (chúng sắp xếp đầu tiên, trước các chuỗi rỗng). –

0

so sánh con trỏ của không được quản lý NSString trường cũng tốt, nếu họ là tất cả NSString literals. iow, điều này sẽ làm việc trong MRC theo những điều kiện, cung cấp tất nhiên không có giá trị chuỗi trùng lặp, và giá trị là những gì đang được so sánh.

nếu không, hãy xem câu trả lời thường hữu ích hơn của Ross (+1).

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