2011-02-06 41 views
24

Tôi đã có con trỏ danh sách CDrawObject *Move danh sách phần tử vào cuối trong STL

std::list<CDrawObject*> elements; 

Làm thế nào tôi có thể di chuyển một số phần tử vào cuối danh sách. Tôi thấy STL Algorithms Reference nhưng tôi không tìm thấy hoạt động này. Tôi phải làm việc đó như thế nào?

+8

Không 100% phù hợp với câu hỏi của bạn, nhưng bạn có chắc chắn rằng một danh sách liên kết các con trỏ là lựa chọn cấu trúc dữ liệu hợp lý không? Chỉ có một vài trường hợp mà tôi cho rằng đó là lựa chọn tốt nhất ... – 6502

+1

Đó là khi những gì anh ta đang làm là di chuyển một mục từ giữa danh sách đến cùng. danh sách là bộ sưu tập duy nhất trong đó thực hiện điều này là thời gian không đổi. – CashCow

+0

@CashCow: Thời gian đó, mặc dù không đổi, vẫn có thể dài hơn 'std :: memmove()' nội dung của 'std :: vector' của vùng chứa, đặc biệt là khi các khía cạnh như vị trí dữ liệu (CPU cache) được tính đến. – sbi

Trả lời

45

Sử dụng các mối nối phương pháp danh sách()

void list::splice (iterator position, list<T,Allocator>& x, iterator i);

Move iterator i từ danh sách x vào danh sách hiện tại vị trí "vị trí"

Do đó để di chuyển nó đến cùng đưa

x.splice(x.end(), x, iter); 

(cả hai đều có thể là cùng một danh sách hoặc danh sách khác nhau miễn là danh sách mà mục được di chuyển có cùng loại, cả T và Allocator)

+1

Trong ví dụ của bạn, nếu 'lặp' đã trỏ đến phần tử cuối cùng — thì có cần thiết cho trường hợp đặc biệt không? –

+0

Không cần thiết phải thử nghiệm, và chức năng thư viện vẫn hoạt động. Cho dù nó sẽ là tối ưu là không chắc chắn như C + + spec chỉ nói những gì kết quả của một chức năng phải được và không cho dù nó phải được thực hiện một cách tối ưu nhất. – CashCow

0

Xóa rồi thêm nó vào danh sách của bạn.

+2

Điều này không hiệu quả như câu trả lời đã chọn. – Graeme

+0

sử dụng mối nối cũng không làm mất hiệu lực vòng lặp trong khi điều này không – Sopel

4

A std::list là danh sách được liên kết kép, có nghĩa là bạn không có quyền truy cập ngẫu nhiên vào phần tử n. Bạn phải có thể xóa phần tử, sau đó sử dụng push_back.

+3

Không bạn không phải làm theo cách đó và áp phích quá nhanh để chấp nhận câu trả lời. – CashCow

+1

Tôi không có nghĩa là "phải" theo nghĩa "đó là cách duy nhất", nhưng dù sao, @ G-71 cảm thấy tự do để không chấp nhận câu trả lời của tôi nếu một câu trả lời là tốt hơn. –

+3

+1 hoàn toàn chấp nhận được đối với một container con trỏ. Nếu sao chép một T là tốn kém hơn, mặc dù, nối nên được ưa thích. – sellibitze

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