2010-11-18 55 views
9

Cách "đúng" để thêm tất cả các phần tử từ một std :: list vào một danh sách khác là gì?Cách đơn giản để thêm các phần tử từ danh sách này sang danh sách khác

void 
Node::addChilds(const NodeList *list) 
{ 
    for(NodeList::const_iterator i = list->begin(); 
     i != list->end(); 
     ++i) 
     { 
      this->m_childs.push_back(*i); 
     } 
} 

Tôi nghĩ về std :: sao chép, nhưng afaik cho bản sao tôi phải thay đổi kích thước danh sách điểm đến, sao lưu các iterator cuối (trước khi thay đổi kích thước) vv

tôi đang tìm kiếm một dòng duy nhất tuyên bố.

+1

'NodeList' là gì? 'M_childs' được khai báo như thế nào? –

Trả lời

12

Sử dụng back_insert_iterator. Nếu std::list<T> là loại m_childs,

std::copy(list.begin(), list.end(), 
      std::back_insert_iterator<std::list<T> >(m_childs)); 
+0

cả hai điều này và @ybungalobill là chính xác. Tôi thích điều này tuy nhiên. Đây là lý do tại sao: [http://stackoverflow.com/questions/4152815/stl-use-member-functions-or-functions-in-algorithm/4156380#4156380] –

+3

Tôi đã nghĩ chức năng thành viên 'list :: insert' sẽ hiệu quả hơn. Bất kỳ ý tưởng cho dù đó là đúng? –

+2

Trên Linux/x86 chạy trên Intel Core2 @ 1.86GHz, GCC 4.3.2, điền danh sách với 10000000 phần tử, sao chép danh sách đó vào danh sách khác và in phần tử thứ hai mất ca. Thời gian sử dụng đồng hồ 2,5 giây, thời gian sử dụng 2,1 giây, không phụ thuộc vào việc sử dụng 'copy' hoặc' insert'. –

13
this->m_childs.insert(this->m_childs.end(), list->begin(), list->end()); 
12

Nếu các yếu tố cần được di chuyển, bạn có thể sử dụng nối. Nếu không sao chép chúng, như được giải thích bởi ybungalobill hoặc larsmans.

3

Scott Meyers viết về chủ đề cụ thể này trong "Hiệu lực STL", trong mục 5 (và đề cập đến splice trong mục 4). Ông thích phiên bản của ybungalobill, nhưng chủ yếu là vì ông nghĩ rằng mã là sạch hơn và rõ ràng hơn vì nó nhấn mạnh từ 'chèn' và không phải là từ 'bản sao'.

Hầu hết mọi công dụng của std::copy sử dụng trình lặp (như back_inserter) có thể được thay thế bằng các cuộc gọi đến các hàm thành viên phạm vi (như .insert(position, begin, end)).

splice là chức năng thành viên liên tục, vì vậy sẽ nhanh hơn nếu được áp dụng trong trường hợp cụ thể này.

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