cách nối một đối tượng <T> trong danh sách vào một đối tượng khác


92

trong C ++, tôi có hai list<T>đối tượng ABvà tôi muốn để thêm tất cả các thành viên của Bđến cuối A. Tôi đã tìm kiếm một vài nguồn khác nhau và không tìm thấy một giải pháp đơn giản (ei A.append(B);) và điều này làm tôi ngạc nhiên một chút.

Cách tốt nhất để làm việc này là gì?

Khi nó xảy ra, tôi không quan tâm đến B sau điều này (nó sẽ bị xóa ở dòng tiếp theo) vì vậy nếu có cách tận dụng điều đó để có hiệu suất tốt hơn, tôi cũng quan tâm đến điều đó.

Câu trả lời:


192

Nếu bạn muốn nối các bản sao của các mục trong B, bạn có thể thực hiện:

a.insert(a.end(), b.begin(), b.end());

Nếu bạn muốn di chuyển các mục của B đến cuối A (làm trống B cùng một lúc), bạn có thể thực hiện:

a.splice(a.end(), b);

Trong tình huống của bạn, nối sẽ tốt hơn, vì nó chỉ liên quan đến việc điều chỉnh một vài con trỏ trong danh sách được liên kết.


8
+1. Quá đúng. Nếu nó có thể có được như vậy dễ dàng và hiệu quả để bản đồ "lát" và bộ ...
paercebal

Một trong hai phép toán này có phải là O (1) không?
Chris Redford

2
Tôi đoán mối nối phải là O (1) cho trường hợp trên.
chunkyguy

9
Nó là O (1) cho a.splice(a.end(), b)a.splice(a.end(), b, it_b_start), nhưng là O (n) cho a.splice(a.end(), b, it_b_start, it_b_end).
hkBattousai

9
Tại sao, tại sao, STL không thể chỉ hỗ trợ a.append (b)?
srking

-3

một ví dụ sử dụng boost

std::list<T> A; // object A is a list containing T structure
std::list<T> B; // object B is a list containing T structure

// append list B to list A
BOOST_FOREACH(auto &listElement, B) { A.push_back( listElement ); }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.