у меня есть
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)));
Снова тот же результат. Зачем?
Эта демонстративная программа скомпилирована и дает ожидаемый результат
#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
Другая причина может заключаться в том, что вектор является членом данных класса, и вместо использования этого элемента данных вы используете локальное определение вектора в некоторой функции-члене. Это общая ошибка начинающих.
Поэтому вам нужно проверить, действительно ли вы имеете дело с исходным вектором в каждой из операций.