Tôi có một số mã mà trông như thế này:std :: inserter với bộ - chèn để bắt đầu() hoặc kết thúc()?
std::set<int> s1, s2, out;
// ... s1 and s2 are populated ...
std::set_intersection(s1.begin(), s1.end(),
s2.begin(), s2.end(),
std::inserter(out, out.end()));
Tôi đã chèn đọc có thể được thực hiện trong thời gian liên tục khấu hao nếu giá trị được chèn vào tập ngay sau iterator được coi là một "gợi ý". Điều này rõ ràng sẽ mang lại lợi ích khi chạy giao lộ được thiết lập, đặc biệt là vì mọi thứ được ghi vào out
đã được sắp xếp theo thứ tự sắp xếp.
Làm cách nào để đảm bảo hiệu suất tối ưu này? Khi tạo std::inserter
, out
bị trống để out.begin() == out.end()
vì vậy tôi không thể thấy nó có khác biệt gì dù tôi chỉ định out.begin()
hoặc out.end()
làm gợi ý. Tuy nhiên, nếu điều này được giải thích khi chèn mọi phần tử tại begin()
, có vẻ như tôi sẽ không nhận được hiệu suất thuật toán tối ưu. Điều này có thể được thực hiện tốt hơn?
@Ahsleys: Ít nhất bằng cách chọn 'end' bạn không pessimize thuật toán vì không có yếu tố sau (do đó tiết kiệm một so sánh). Tôi tự hỏi tuy nhiên (như bạn đang có) nếu iterator bạn vượt qua sẽ thực sự phát triển hoặc bị mắc kẹt ở đầu/cuối. –