C ++ chuyển đổi vectơ <int> thành vectơ <double>


93

Cách tốt nhất để chuyển đổi a thành là std::vector<int> intVecstd::vector<double> doubleVec. Hay, tổng quát hơn, để chuyển đổi hai vectơ thuộc loại chuyển đổi?

Câu trả lời:


164

Sử dụng hàm tạo std::vectorphạm vi của:

std::vector<int> intVec;
std::vector<double> doubleVec(intVec.begin(), intVec.end());

Vì vậy, bạn cũng có thể sử dụng std::copy(...)chức năng sau đó? Bạn có thể thêm điều đó vào câu trả lời?
Alan Turing

3
@Lex: copy(v_int.begin(), v_int.end(), back_inserter(v_float));hoặcv_float.resize(v_int.size()); copy(v_int.begin(), v_int.end(), v_float.begin());
Jon Purdy

1
ý tưởng tồi, bởi vì phiên bản hàm tạo sẽ đặt trước vectơ bằng cách sử dụng danh mục trình vòng lặp để lưu ý rằng đó là các trình vòng lặp truy cập ngẫu nhiên và sau đó dành đủ không gian. Thay đổi kích thước trước khi sao chép là một khởi tạo bằng 0 lãng phí.
Michael Goldshteyn

1
@MichaelGoldshteyn Tôi không hiểu - nếu bạn không chỉ định kích thước trước, thì nó sẽ được tự động thay đổi kích thước bất cứ khi nào vượt quá dung lượng (sao chép tất cả các phần tử nhiều lần). Được rồi, đây là thời gian tuyến tính được khấu hao, nhưng tôi cá rằng nó vẫn chậm hơn rất nhiều so với một lần khởi tạo 0 đơn lẻ. Tôi có thiếu một cái gì đó về lập luận của bạn?
Algoman

1
@Algoman xem std::distance()"Nếu đó là một trình lặp truy cập ngẫu nhiên, hàm sử dụng toán tử- để tính toán điều này. Nếu không, hàm sử dụng toán tử tăng (operator ++) lặp lại." Vì vậy, trong trường hợp này, số lượng phần tử có thể được tìm thấy bằng cách trừ đi các trình vòng lặp. Liệu thư viện chuẩn có được triển khai để sử dụng std :: distance cho dự trữ ban đầu () hay không là một câu hỏi khác, nhưng godbolt.org/z/6mcUFh ít nhất cũng chứa một lệnh gọi đến std :: distance ().
user1556435
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.