2012-06-27 14 views
7

Trong Java, có một lớp thư viện java.util.Stack thực hiện tốt các phương thức push và pop. Có điều gì tương tự trong Mục tiêu C không?Mục tiêu C NSStack và NSQueue?

Tôi chỉ tìm thấy MutableArray. Có vẻ lạ tôi sẽ phải thực hiện một điều cơ bản như một chồng, phải có một cái gì đó như "NSStack", "NSQueue" và các công cụ tương tự khác.

+0

bản sao có thể có của [SDK iOS có cung cấp hàng đợi và ngăn xếp không?] (Http://stackoverflow.com/questions/3652709/does-the-ios-sdk-provide-queues-and-stacks) – mattjgalloway

Trả lời

9

Tôi đã triển khai ngăn xếp here. Nó sử dụng NSMutableArray để làm công việc bẩn thỉu mà thực sự không phải là xấu. Nhưng không có gì được xây dựng trong nền tảng.

+2

cảm ơn, thực sự trông khá dễ dàng. Java làm cho mọi người lười biếng :) – iseeall

+1

Đúng, quá đúng! Thật vui khi bạn thấy nó hữu ích. Về cơ bản - bạn có thể không cần một hàng đợi hoặc một ngăn xếp, chỉ cần sử dụng một 'NSMutableArray' và bạn sẽ được sử dụng tốt. – mattjgalloway

1

theo như tôi biết, không có gì giống như ngăn xếp và hàng đợi trong sdk.
có ví dụ về triển khai hàng đợi here.

18

Không ai nên quên Objective-C cung cấp một biến thể khá đẹp: Objective-C++. Và thư viện chuẩn C++ cung cấp các cấu trúc dữ liệu bạn cần, được kiểm thử, sửa lỗi, ổn định và nhanh nhất có thể. Tốt nhất, họ sẽ làm việc với ARC một cách hoàn hảo. Tốt nhất, bạn thậm chí có thể chọn giữa các con trỏ __weak hoặc __strong nếu bạn cảm thấy nó.

Hãy xem <queue><stack>.

Điều đó nói rằng, NSMutableArray hoạt động hoàn toàn tốt cho ngăn xếp: -addObject:, -lastObject-removeLastObject sẽ thực hiện công việc độc đáo với hiệu suất tốt.

C++ có thể dài dòng. Horribly tiết. Nhưng nó cũng có một số thanh lịch ở đây và ở đó, và một số cấu trúc rất mạnh mẽ. Một số phần của thư viện chuẩn thực sự tỏa sáng, và cấu trúc dữ liệu nằm trong số các viên ngọc khi cú pháp ngoài hành tinh được làm chủ. Nó có thể được ẩn với một vài typedefs anyway.

+3

C + + ghét xung quanh? –

+2

Không, nhưng một ví dụ về mã lil nhỏ về cách sử dụng từ tệp mục tiêu C .m sẽ không bị tổn thương;) – xaphod

+0

Có một vấn đề - các lớp C++ chỉ có trong tệp .mm và ngay khi tôi đổi tên của tôi .m to .mm, trình biên dịch XCode 8 đột nhiên bắt đầu gửi spam cho tôi với các lỗi liên kết cho một số tiêu đề tôi đang sử dụng, ví dụ 'Các ký hiệu không xác định cho kiến ​​trúc x86_64: " _OBJC_CLASS _ $ _ IOBluetoothRFCOMMChannel ", được tham chiếu từ: objc-class-ref trong BluetoothRfcommPort.o' Vì vậy, đôi khi nó không phải là một tùy chọn để đi Obj-C++, Trừ khi tôi đang thiếu một cái gì đó. – JustAMartin

1

Bạn (như bản thân mình) có thể lo lắng về hiệu suất dequeue của việc sử dụng NSMutableArray, vì trong dequeue bạn phải loại bỏ đối tượng đầu tiên trong NSMutableArray, và việc loại bỏ sẽ làm thay đổi tất cả các đối tượng trong mảng. Tuy nhiên, điều này là không cần thiết dựa trên thử nghiệm tôi đã làm here: đối với một NSMutableArray chứa 100000 đối tượng, loại bỏ tất cả các đối tượng bằng cách liên tục loại bỏ đối tượng đầu tiên chậm hơn 100ms bằng cách liên tục loại bỏ đối tượng cuối cùng. Tôi cũng so sánh sử dụng một NSMutableArray với việc sử dụng hai NSMutableArrays. Mặc dù có thể tránh việc loại bỏ đối tượng đầu tiên bằng cách sử dụng hai NSMutableArrays được sử dụng làm hai ngăn xếp, giải pháp ngăn xếp gấp đôi thực sự chậm hơn.