2012-02-20 1 views
2

У меня есть вектор времени, и есть несколько мест, где время дублируется. Вектор времени - это только один столбец данных из текстового файла, из одного и того же текстового файла есть несколько других векторов (скорость, положение и т. Д.). Как мне удалять повторяющиеся записи в зависимости от времени, сохраняя все остальные записи? Скажем:C++ Удалить повторяющиеся записи в векторе

if (time[j] == time[j + 1] 
{ 
    do stuff... 
} 

На самом деле у меня есть несколько векторов, поэтому я также удалю дублирующие записи. Мне нужно сохранить порядок данных в других векторах (они не обязательно последовательны.)

Я только хочу удалить последовательные дублирующие точки.

Спасибо.

+0

Вы хотите удалить дубликаты _consectutive_ или все дубликаты? –

+0

Последовательные дубликаты. – user1187621

ответ

1

Ну, милый способ, которым вы могли бы это сделать, - отсортировать вектор, используя std :: sort, а затем вы можете использовать std :: unique для удаления последовательных дубликатов из всего диапазона векторов (.begin() в .end()).

Вы можете, вероятно, найти более эффективный способ, но это интересный один, по крайней мере, и потребуется только 2 строки кода :)

+0

На самом деле у меня есть несколько векторов, поэтому я также удалю дубликаты записей. Мне нужно сохранить порядок данных в других векторах (они не обязательно последовательны.) – user1187621

1

Как вы говорите дубликатами следовать Афоризм вы можете использовать эту вариацию на erase-remove idiom, в противном случае вам придется сортировать первый (см std::sort или std::stable_sort)

time.erase(std::unique(time.begin(),time.end()),time.end()); 
+0

std :: unique не отображается для меня в VC++ 2010 – user1187621

+1

@ user1187621: вы должны включить заголовок '' , Afaik - это библиотека pre-C++ 11, поэтому VS2010 должен иметь ее (не могу проверить себя, хотя). – KillianDS

+0

Это работает, за исключением случаев, когда я использую этот метод для других векторов, я в конечном итоге удаляю больше «повторяющихся» точек данных, чем я делаю из вектора времени. Я хочу только удалить повторяющиеся повторяющиеся точки. – user1187621

1

Почему просто не избежать добавления дубликатов для начала? И.Е. проверьте, существует ли элемент, прежде чем добавлять его в вектор.

+0

Я читаю данные из текстового файла, и способ, которым я его читаю, не настроен, чтобы проверить, совпадают ли значения. – user1187621

1

При заказе должны быть сохранены и дубликаты не подряд:

{ 
    auto i = time.begin() 
    std::set<time::value_type> exists; 
    while(i != time.end()) { 
     if (exists.insert(*i).second == false) //it's a duplicate: 
      i = time.erase(i); 
     else //else not a duplicate 
      ++i; 
    } 
} 
0

Я в конечном итоге просто скопировать данные на новый вектор и удаление дубликатов записей по пути.