Với một vector STL, chỉ đưa ra các bản sao theo thứ tự sắp xếp, ví dụ,Làm thế nào để giữ cho bản sao chỉ có hiệu quả?
INPUT : { 4, 4, 1, 2, 3, 2, 3 }
OUTPUT: { 2, 3, 4 }
Thuật toán là tầm thường, nhưng mục đích là để làm cho nó hiệu quả như std :: duy nhất(). thực hiện ngây thơ của tôi sẽ thay đổi container tại chỗ:
thực hiện ngây thơ của tôi:
void not_unique(vector<int>* pv)
{
if (!pv)
return;
// Sort (in-place) so we can find duplicates in linear time
sort(pv->begin(), pv->end());
vector<int>::iterator it_start = pv->begin();
while (it_start != pv->end())
{
size_t nKeep = 0;
// Find the next different element
vector<int>::iterator it_stop = it_start + 1;
while (it_stop != pv->end() && *it_start == *it_stop)
{
nKeep = 1; // This gets set redundantly
++it_stop;
}
// If the element is a duplicate, keep only the first one (nKeep=1).
// Otherwise, the element is not duplicated so erase it (nKeep=0).
it_start = pv->erase(it_start + nKeep, it_stop);
}
}
Nếu bạn có thể làm này hiệu quả hơn, thanh lịch, hay nói chung, xin vui lòng cho tôi biết. Ví dụ, một thuật toán sắp xếp tùy chỉnh hoặc sao chép các phần tử trong vòng lặp thứ hai để loại bỏ lệnh gọi xóa().
std :: unique() giả định véc tơ được sắp xếp. Bạn có thể cung cấp chi tiết cụ thể về lý do bạn cho rằng mã của mình kém hiệu quả hơn không? –
Chỉ để chọn những gì bạn có: lấy container bằng cách tham khảo. Không có lý do gì để sử dụng một con trỏ ở đây (và bạn không an toàn với 'keep_duplicates (0)', ví dụ.) Cả hai mã bên trong hàm và lời gọi hàm sẽ được đơn giản hóa một chút. :) – GManNickG
Để làm rõ: nếu đầu vào là '{1, 1, 1}', thì đầu ra là '{1}' hay '{1, 1}'? – rlbond