2013-05-10 32 views
7

Chỉ muốn xóa các mục trùng lặp. Hồ bơi là vector<pair<string, int>> nhưng tôi dường như bỏ lỡ một số yếu tố khi bắt đầu vectơ bằng cách nào đó. Bất cứ ai có thể xác minh logic của việc loại bỏ? Cảm ơn :)Xoá mục nhập trùng lặp trong C++ Vector

Pool Master::eliminateDuplicates(Pool generation) 
{ 
    for(int i = 0; i < generation.size(); i++) 
    { 
     string current = generation.at(i).first; 

     for(int j = i; j < generation.size(); j++) 
     { 
      if(j == i) 
      { 
       continue; 
      } 
      else 
      { 
       string temp = generation.at(j).first; 
       if(current.compare(temp) == 0) 
       { 
        Pool::iterator iter = generation.begin() + j; 
        generation.erase(iter); 
       } 
      } 
     } 
    } 

    return generation; 
} 
+1

Bạn có phiền không nếu nó được sắp xếp? – chris

+0

Eww, các bản sao đó ... –

+1

Cách dễ dàng hơn (và có khả năng nhanh hơn cách 'O (n^2)' hiện đang thực hiện) khi thực hiện việc này là thêm tất cả các phần tử vào tập lệnh 'std :: set' và sau đó quay lại 'std :: vector'. – Yuushi

Trả lời

4

Đây là vấn đề rất phổ biến.

Vì sau khi bạn xóa một phần tử, vị trí j nhọn sẽ bỏ qua một phần tử do j ++ trên vòng lặp for. giải pháp đơn giản nhất để giải quyết vấn đề dựa trên mã của bạn là thêm j-- sau generation.erase (ITER):

generation.erase(iter); 
    j--; 
+0

Cảm ơn, đó là nó. : D – T3CHN0CR4T

19

Nếu bạn không nhớ sắp xếp các vector, sau đó bạn có thể sử dụng std::unique. Đó sẽ là O (Nlog (N))

#include <iostream> 
#include <algorithm> 
#include <vector> 

int main() 
{ 
    std::vector<int> v{1,2,3,1,2,3,3,4,5,4,5,6,7}; 
    std::sort(v.begin(), v.end()); 
    auto last = std::unique(v.begin(), v.end()); 
    v.erase(last, v.end()); 
    for (const auto& i : v) 
     std::cout << i << " "; 
    std::cout << "\n"; 
} 
+6

+1 Ai đó nên viết một mục wiki/FAQ cho tất cả các tập quán sử dụng vector bánh mì và bơ. – TemplateRex

+0

@rhalbersma, đã đồng ý. –

+2

@rhalbersma, SO nên duy trì một danh sách các câu hỏi thường gặp nhất về các chủ đề phổ biến, như Top 10 C++ câu hỏi hoặc một cái gì đó. Đó sẽ là tiện dụng. : D – T3CHN0CR4T