2009-01-19 32 views

Trả lời

81

Tại sao bạn lặp lại và không sử dụng thuật toán sao chép chuẩn?

std::copy(vector.begin(), vector.end(), std::back_inserter(list)); 
+0

Nên là tiêu chuẩn :: sao chép thay vì stl :: sao chép, nhưng nếu không thì đây là phương pháp ưu tiên khi sử dụng trình lặp để sao chép. – workmad3

0

Bạn có thể thử sử dụng những thứ phức tạp hơn từ <algorithm> tiêu đề, ví dụ for_each hoặc copy ... nhưng họ sẽ lên tới điều tương tự, theo ý kiến ​​của tôi.

+0

for_each sẽ tính bằng nhau. Sao chép có thể bị quá tải để cung cấp cơ chế sao chép hiệu quả hơn nhiều tùy thuộc vào các trình vòng lặp được cung cấp và thường là cơ chế ưu tiên. – workmad3

56

Nếu bạn đang thực hiện một danh sách mới, bạn có thể tận dụng lợi thế của một nhà xây dựng mà có bắt đầu và kết thúc vòng lặp: Câu trả lời

std::list<SomeType> myList(v.begin(), v.end()); 

Kasprzol là hoàn hảo nếu bạn có một danh sách hiện tại bạn muốn thêm vào.

1

Tôi thích đề xuất này để xây dựng danh sách mới.

std::list<SomeType> myList(v.begin(), v.end()); 

Nhưng khi phụ thêm vào danh sách hiện có, điều sau có thể tối ưu cho các tập dữ liệu nhỏ. Bởi "tối ưu", tôi có nghĩa là dễ nhớ nhất cách làm và dễ hiểu nhất. (Đây là những báo cáo chủ quan, tôi chắc chắn rằng nó phụ thuộc vào cách bộ não của bạn là có dây.)

for (unsigned i=0; i<v.size(); i++) myList.push_back(v[i]); 

Sử dụng vòng lặp trên vectơ có thể được quá pedantic trong nhiều trường hợp. Lập chỉ mục đơn giản thường hoạt động tốt.

Một chủ đề khác lặp địa chỉ so với chỉ mục (here). Trong chủ đề đó, câu trả lời được chọn về cơ bản là các trình vòng lặp ưu tiên vì chúng là chung chung hơn. Nhưng nếu các vectơ là loại container được sử dụng phổ biến nhất, tôi nghĩ rằng nó là hợp lý để chuyên loại thuật toán đơn giản này.

6
list.assign(vector.begin(), vector.end()); 
+0

Điều này rất hữu ích, nhưng có lẽ bạn nên thêm một số mã không vào câu trả lời này để tránh cờ VLQ tiềm năng. –

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