2012-12-20 23 views
6

Tôi tạo một std::list các mục (cấu trúc thành phần biểu đồ) được hợp nhất theo định kỳ với nhau. Ý tưởng là nếu tôi phát hiện ra một nút kết nối hai thành phần, chúng trở thành một thành phần duy nhất và danh sách của tôi liệt kê các thành phần của tôi. Mỗi thành phần có một tay cầm (trong trường hợp này là std::list<component>::iterator) thành thành phần "cha mẹ" được thiết lập khi nó được hợp nhất. Cách này để xác định thành phần một nút cụ thể thuộc về tôi đi bộ chuỗi này.Xóa mục trong std :: list trong khi để nó được phân bổ

Trong cuối những gì tôi đang tìm kiếm là hoạt động trên std::list cho phép tôi để có một iterator của mục N, và loại bỏ nó khỏi danh sách nhưng không deallocating nó: cấu trúc của phần còn lại của danh sách được sửa đổi chính xác giống như cách xóa thông thường.

Tốt hơn là cái gì đó ít xấu xí hơn phân bổ lại mục, sao chép mục từ danh sách và gọi số remove hoặc erase thực.

Có lẽ tôi có thể hoàn thành nó với splice. Tôi cần phải ghép các yếu tố để được loại bỏ vào một "rác" list, phải không?

+5

'ghép nối vào danh sách _junk_ âm thanh về đúng ... –

+0

Và cách tiếp cận như vậy có khả năng không chắc rằng việc sử dụng trình phân bổ không tương thích sẽ buộc sao chép. Tuy nhiên ... có thêm một vài con trỏ bị xáo trộn. Vâng ... không * tổn thương * để có một cách để lặp qua các nút không đầy đủ mồ côi của tôi. –

+0

Tại sao sử dụng danh sách thay vì danh sách không phù hợp với bạn? –

Trả lời

1

Bạn có thể thực hiện việc này bằng mối nối. Ví dụ, di chuyển *it vào danh sách rác:

junk.splice(junk.begin(),comp_list,it); 

Bạn cũng có thể thêm động thái-ctor để component. Sau đó, trước khi xóa nội dung từ danh sách chuyển sang tmp var, một cái gì đó như thế này:

component tmp(*it); 
li.erase(it); 

Cũng đề nghị của Fomin Arseniy để sử dụng danh sách các con trỏ tới các thành phần (hoặc std::shared_ptr) là tốt quá.

+0

một danh sách '' đơn giản có thể dẫn đến sổ sách kế toán thủ công hơn mức cần thiết, nhưng 'danh sách >' có thể là một cách tiếp cận vững chắc. Tôi muốn giữ mọi thứ đơn giản: với cách tiếp cận danh sách rác tôi có thể tránh viết từ khóa 'mới'. –

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