2009-04-12 32 views
14

Ai đó có thể chỉ ra một ánh xạ tốt giữa các thùng chứa C++ STL thông thường như vector, danh sách, bản đồ, thiết lập, multimap ... và các thùng chứa chung C#?Ánh xạ giữa stl C++ và C# containers

Tôi đã quen với những cái cũ và bằng cách nào đó tôi đã quen với việc thể hiện các thuật toán về các thùng chứa đó. Tôi đang gặp khó khăn trong việc tìm kiếm C# tương đương với những thứ đó.

Cảm ơn bạn!

+1

Bạn đã tình cờ gặp những gì có lẽ là thiếu sót lớn nhất trên thư viện lớp cơ sở .NET ...Họ đang thiếu rất nhiều container tương đối phổ biến. Và trong khi LINQ làm tốt công việc thay thế các trình lặp C++, nó vẫn không linh hoạt (hoặc hiệu quả) – jalf

Trả lời

20

Dưới đây là một thô tương đương:

  1. Dictionary<K,V> < =>unordered_map<K,V>
  2. HashSet<T> < =>unordered_set<T>
  3. List<T> < =>vector<T>
  4. LinkedList<T> < =>list<T>

.NET BCL (thư viện lớp cơ sở) không có cây đỏ đen (stl map) hoặc hàng đợi ưu tiên (make_heap(), push_heap(), pop_heap()).

Bộ sưu tập .NET không sử dụng "trình lặp" theo cách của C++. Tất cả đều thực hiện IEnumerable<T> và có thể được lặp lại bằng cách sử dụng câu lệnh "foreach". Nếu bạn muốn kiểm soát thủ công việc lặp lại, bạn có thể gọi "GetEnumerator()" trên bộ sưu tập sẽ trả lại IEnumerator<T> bộ lọc. IEnumerator<T>.MoveNext() tương đương với "++" trên trình lặp C++ và "Hiện tại" tương đương với toán tử con trỏ ("*").

C# có tính năng ngôn ngữ được gọi là "trình lặp". Tuy nhiên, chúng không giống như "đối tượng lặp" trong STL. Thay vào đó, chúng là một tính năng ngôn ngữ cho phép thực hiện tự động IEnumerable<T>. Xem tài liệu cho các câu hỏi yield returnyield break để biết thêm thông tin.

+0

Xin lỗi, nhưng tôi nghĩ bạn có C++ và Java hơi nhầm lẫn ở đó. (Mặc dù phần còn lại của cuộc thảo luận của bạn có vẻ đúng, tất cả các lớp mà bạn liệt kê ở bên phải của bảng là các bộ sưu tập Java, chứ không phải các thùng chứa STL.) –

+0

Tôi có vỏ sai, và tôi để lại "_" trong công cụ băm (chúng không chuẩn, nhưng hầu hết các trình biên dịch đều hỗ trợ chúng). Tôi đã cập nhật tên. –

-2

Không có bản đồ trực tiếp tuyệt vời, ví dụ: C++ thiết lập và so sánh sử dụng bản đồ, trong khi .Net HashSet và sử dụng các mã băm từ điển.

1

Bạn cũng có thể muốn có một cái nhìn tại STL/CLR đó là

... là một gói những Standard Template Library (STL), một tập hợp con bộ thư viện chuẩn C++, để sử dụng với C++ và .NET Framework thời gian chạy ngôn ngữ chung (CLR). Với STL/CLR, bạn có thể sử dụng tất cả các vùng chứa, vòng lặp và thuật toán của STL trong môi trường được quản lý.

Ngoài ra, hãy nhớ rằng bạn có thể biên dịch mã C++/STL hiện tại của mình với cờ /clr.

+1

Bạn có kinh nghiệm gì về điều đó không? Theo tôi hiểu nó, nó chỉ cho phép bạn sử dụng mã STL giống như trong C++ được quản lý. Nó không cung cấp khả năng thực thi STL giống như bất khả tri về ngôn ngữ, phải không? Tôi muốn có một cái gì đó giống như STL trong C#. :) – jalf

+0

Tôi đã không thực sự cố gắng này, nhưng có vẻ như "tất cả" bạn phải làm là thêm một tham chiếu đến Microsoft.VisualC.STLCLR và thực hiện IVector <> (hoặc IDeque <>, IList <>, vv .) –