сортировка, уникальная, стирание не работает

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
    Запустите, как ожидается, здесь .
  • 1
    Скорее всего, ваш код для проверки того, что находится в векторе впоследствии, неверен.
Показать ещё 2 комментария
Теги:
boost
erase
unique

1 ответ

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 

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню