2014-11-06 4 views
0

У меня естьрода, уникальное, Стирание не работает

std::vector<int> gid; 

, который содержит не заказанные целые числа. Я хочу сортировать, создавать уникальные значения и стирать повторяющиеся целые числа. Я пробовал следующие коды:

std::sort(gid.begin(),gid.end()); 
std::vector<int>::iterator itv(std::unique(gid.begin(),gid.end())); 
gid.erase(itv,gid.end()); 

но окончательный вектор заказывается. Поэтому я попытался

std::sort(gid.begin(),gid.end()); 
std::vector<int>::iterator itv(std::unique(gid.begin(),gid.end())); 
gid.resize(std::distance(gid.begin(),itv)); 

и снова вектор только упорядочен родом. Я также попытался с повышением:

boost::erase(gid, boost::unique<boost::return_found_end>(boost::sort(gid))); 

Опять тот же результат. Почему?

+4

Запуск как ожидается [здесь] (https://ideone.com/VghsbZ). – Jarod42

+1

Скорее всего, ваш код, чтобы проверить, что находится в векторе впоследствии, неверен. –

+3

Если вы не предоставите код, который воспроизводит поведение, которое вы наблюдаете, мы не сможем вам помочь. Код кажется правильным. –

ответ

2

Эта демонстративная программа успешно компилируется и дает ожидаемый результат

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

int main() 
{ 
    std::vector<int> gid = { 2, 1, 5, 6, 1, 6, 2, 5 }; 

    std::sort(gid.begin(), gid.end()); 
    std::vector<int>::iterator itv(std::unique(gid.begin(), gid.end())); 
    gid.erase(itv, gid.end()); 

    for (int x : gid) std::cout << x << ' '; 
    std::cout << std::endl; 

    return 0; 
} 

Выход

1 2 5 6 

Я подозреваю, что вы передаете вектор в функцию по значению, а не по ссылке. Таким образом, вы меняете копию исходного вектора. Например

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

void remove_duplicates(std::vector<int> gid) 
{ 
    std::vector<int>::iterator itv(std::unique(gid.begin(), gid.end())); 
    gid.erase(itv, gid.end()); 
} 

int main() 
{ 
    std::vector<int> gid = { 2, 1, 5, 6, 1, 6, 2, 5 }; 
    std::sort(gid.begin(), gid.end()); 

    remove_duplicates(gid); 

    for (int x : gid) std::cout << x << ' '; 
    std::cout << std::endl; 

    return 0; 
} 

Выход будет

1 1 2 2 5 5 6 6 

Но если вы измените объявление параметра как

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

void remove_duplicates(std::vector<int> &gid) 
{ 
    std::vector<int>::iterator itv(std::unique(gid.begin(), gid.end())); 
    gid.erase(itv, gid.end()); 
} 

int main() 
{ 
    std::vector<int> gid = { 2, 1, 5, 6, 1, 6, 2, 5 }; 
    std::sort(gid.begin(), gid.end()); 

    remove_duplicates(gid); 

    for (int x : gid) std::cout << x << ' '; 
    std::cout << std::endl; 

    return 0; 
} 

, то результат будет, как ожидается,

1 2 5 6 

Другая причина n, если вектор является членом данных класса, и вместо использования этого элемента данных вы используете локальное определение вектора в некоторой функции-члене. Это общая ошибка начинающих.

Итак, вам нужно проверить, действительно ли вы имеете дело с исходным вектором в каждой из операций.

Смежные вопросы