Tôi đang sử dụng một số lớp và một số phương thức tiện ích sử dụng std :: vector.cách nhanh để triển khai pop_front thành std :: vector
Bây giờ tôi cần phải sử dụng từng khung một phương thức pop_front - push_back trên một trong các lớp đó (nhưng chúng đều được liên kết và làm việc cùng nhau vì vậy tôi không thể thay đổi chỉ một).
Hầu hết các hoạt động được lặp qua tất cả các hoạt động của phần tử và push_back, vì vậy những gì tôi nên làm cho công việc tốt nhất là: dĩa kho lưu trữ của các lớp và tiện ích đó, lấy mẫu mọi thứ và sử dụng deque hoặc list.
Nhưng điều này có nghĩa là rất nhiều mã viết lại và rất nhiều thử nghiệm mà sẽ làm cho tôi bỏ lỡ thời hạn.
Vì vậy, tôi cần lời khuyên để viết một pop_front hiệu quả cho một vector kích thước tĩnh (kích thước sẽ không thay đổi).
Tôi đã tìm thấy một cách here:
template<typename T>
void pop_front(std::vector<T>& vec)
{
vec.front() = vec.back();
vec.pop_back();
vec.front() = vec.back(); // but should this work?
}
Và ý tưởng khác nên là:
template<typename T>
void pop_front(std::vector<T>& vec, already_allocated_vector vec1)
{
vec1.clear();
copy(vec.begin(), vec.end()-1, vec1.begin());
copy(vec1.begin(), vec1.end(), vec.begin());
}
là gì nhanh hơn của hai giải pháp này? Bất kỳ giải pháp nào khác?
Ý bạn là gì bởi "kích thước sẽ không thay đổi"? Sau khi thực hiện pop_front, vectơ sẽ có cùng kích thước như trước đây? Nếu vậy, liệu nguyên tố cuối cùng có phải là rác? –
vectơ có cùng kích thước, bởi vì sau một cửa sổ bật lên, tôi đột nhiên nhấn mạnh. mỗi khung hình tôi tạo ra một cửa sổ pop và một push trong cùng một phương thức như vậy trước và sau phương thức này, vector có cùng kích thước – nkint
Trước khi lo lắng về tốc độ, hãy lo lắng về ** độ chính xác **. Tất cả tốc độ trên thế giới có nghĩa là không có gì nếu kết quả bạn nhận được chỉ đơn giản là sai, và theo như tôi có thể nói, cả hai ứng cử viên của bạn là sai. Cái đầu tiên nên được đặt tên là 'pop_back_and_overwrite_front_with_penultimate', và cái thứ hai nên được đặt tên là' invoke_undefined_behavior_and_pop_back'. (Ghi vào 'vec1.begin()' là không xác định vì 'vec1' trống, bạn cần viết' vec1.resize (vec.size() - 1) 'thay vì' vec1.clear() '.) Khi tôi xử lý các hoạt động vectơ, đôi khi tôi vẽ một bức tranh. Có lẽ điều đó cũng sẽ giúp ích cho bạn. –