std:unique
thực sự chỉ thay đổi các phần tử về đầu khi cần. Sự thay đổi không giống như bạn có thể suy nghĩ. Nó không cần phải có một số yếu tố được truyền bá một yếu tố. Có thể tận dụng yêu cầu yếu tố phải là chuyển nhượng được chuyển nhượng. Theo định nghĩa của chuyển-di chuyển, khi một phần tử được di chuyển, nội dung trước của nó không được chỉ định. Trong trường hợp của bạn, nó chỉ giữ "giá trị" ở đó, nhưng nó không phải là giá trị được chỉ định.
Tóm lại, những gì bạn thấy là giá trị còn lại và một số trong số đó có thể là không cụ thể.
Sau đây là bản trình diễn đơn giản sử dụng dữ liệu của bạn. Ban đầu chúng tôi có hai vị trí khe cắm, R và W. Tôi không đảm bảo rằng đây là thuật toán được sử dụng bởi std::unique
(Tôi thực sự không biết).
vỏ ra các trường hợp tầm thường (tự 0 hoặc 1-chiều dài), khi một giá trị là phải giữ nó là di chuyển-giao trong khe tiếp theo trên W và W là tiên tiến. Bất kể nó được lưu giữ hay không, R luôn được nâng cao. Khi hoàn tất, vị trí qua W là last
(nghĩa là lần đầu tiên của các vị trí còn lại trên các vị trí, một số có thể có giá trị không xác định).
Với dữ liệu của bạn, trình tự sẽ là một cái gì đó như thế này:
1, 2, 2, 2, 3, 3, 2, 2, 1 - different, since the write target
W R is the same as the read-point, do nothing,
and advance both R and W
1, 2, 2, 2, 3, 3, 2, 2, 1 - equivalent, advance R only
W R
1, 2, 2, 2, 3, 3, 2, 2, 1 - equivalent, advance R only
W R
1, 2, 2, 2, 3, 3, 2, 2, 1 - different, move the 3 to the next write
W R point and advance both R and W
1, 2, 3, 2, 3, 3, 2, 2, 1 - equivalent, advance R only
W R
1, 2, 3, 2, 3, 3, 2, 2, 1 - different, move the 2 to the next write
W R slot and advance both R and W
1, 2, 3, 2, 3, 3, 2, 2, 1 - equivalent, advance R only
W R
1, 2, 3, 2, 3, 3, 2, 2, 1 - different, move the 1 to the next write
W R slot and advance both R and W
1, 2, 3, 2, 1, 3, 2, 2, 1 - read is at end-of-sequence
W R
Tại thời điểm này, người đọc xong. khe đầu tiên qua W là last
khi thuật toán đi (và có thể thực sự là end
nếu chuỗi gốc không có bản sao). Tôi để lại cho bạn thử thách xác định các yếu tố nào (3,2,2,1) ở trạng thái "không xác định" sau khi hoàn thành.
Gợi ý: điều gì đã được di chuyển? Điều gì đã bị bỏ qua? Điều gì đã bị ghi đè? Tại sao nó lại quan trọng? Hãy thử viết 0
trên khe đọc của bất kỳ thứ gì là đã di chuyển và xem những gì còn sót lại theo thứ tự từ last
đến end
.
Nó không phải là rất rõ ràng những gì bạn đang yêu cầu ở đây. Khi tôi thay đổi cấu trúc 'v' sao cho nó biên dịch, khi tôi chạy, tôi nhận được kết quả mong đợi. – bentank
"... ai đó có thể giải thích cho tôi làm thế nào chúng tôi nhận được 3 2 2 1" Chắc chắn, * chúng tôi không *: [xem nó sống] (http://ideone.com/gLyemr). Bạn có nghĩa là các phần tử * leftover * (trong mã của bạn, từ 'last' up to' v.end() ')? – WhozCraig
Có, tôi đã tự hỏi làm thế nào họ có được cuối cùng lên v.end – Belphegor