Có nhiều thuật toán thú vị bị thiếu trong phần thuật toán. Việc đệ trình ban đầu của STL không đầy đủ từ quan điểm của Stepanov và một số thuật toán thậm chí còn bị loại bỏ. Các proposal bởi Alexander Stepanov và Meng Lee dường như không bao gồm một thuật toán inplace_merge_unique()
hoặc bất kỳ biến thể nào của chúng.
Một trong những lý do tiềm năng tại sao không có thuật toán như vậy là không rõ yếu tố nào nên được loại bỏ: vì so sánh chỉ là thứ tự yếu nghiêm ngặt, lựa chọn yếu tố quan trọng. Một cách tiếp cận để triển khai inplace_merge_unique()
là
- để xóa bất kỳ phần tử nào trùng lặp khỏi phạm vi thứ hai.
- Sử dụng
inplace_merge()
để thực hiện hợp nhất thực tế.
Vị từ để std::remove_if()
sẽ theo dõi vị trí hiện tại trong phần đầu tiên của chuỗi được hợp nhất. Mã bên dưới không được kiểm tra nhưng một số thông tin như vậy sẽ hoạt động:
template <typename BiDirIt, typename Comp>
BiDirIt inplace_merge_unique(BiDirIt begin, BiDirIt middle, BiDirIt end, Comp comp) {
using reference = typename std::iterator_traits<BiDirIt>::reference;
BiDirIt result = std::remove_if(middle, end, [=](reference other) mutable -> bool {
begin = std::find_if(begin, middle, [=](reference arg)->bool {
return !comp(arg, other);
});
return begin != middle && !comp(other, *begin);
});
std::inplace_merge(begin, middle, result, comp);
return result;
}
Nguồn
2014-12-15 03:25:47
Thuật toán như vậy sẽ dễ thực hiện. Bạn có thể dễ dàng thả các phần tử trong bước hợp nhất của sắp xếp hợp nhất. – kay
Một cách hơi hacky để mô phỏng điều này với tăng sẽ là sự kết hợp của hàm Boost.Range 'boost :: inplace_merge' và bộ điều hợp' uniqued'. Điều này sẽ trì hoãn 'duy nhất' đến điểm là phạm vi được lặp lại và sẽ không thêm một bước N bổ sung. Vẫn còn xa hoàn hảo mặc dù. – pmr
pmr, bạn có chắc chắn về điều này không? Cảm thấy với tôi như phạm vi đầu tiên sẽ được inplace_merged, sau đó uniqued? Kể từ khi trình biên dịch/tăng không thể biết rằng những 2 có thể được hợp nhất – NoSenseEtAl