我正在尝试用C ++编写程序,在其中我向a[]
中输入一系列数字,然后将这些数字输出到b[]
中,以删除所有重复项。例如a[] = {1,3,7,6,3,7}
将输出b[] = {1,3,7,6}
。谢谢!
int main() {
int a[10];
int i, n, j;
cout << "n=";
cin >> n;
for (i = 0; i <= n - 1; i++) {
cout << "a[" << i << "]=";
cin >> a[i];
}
for (i = 0; i < n; i++)
{
for (j = i + 1; j < n; j++)
{
if (a[i] == a[j]) {
cout << "b= " << a[i] << endl;
}
}
}
for (i = 0; i <= n; i++) {
if (a[i] != a[j]) {
cout << "b=" << a[i] << endl;
}
}
}
答案 0 :(得分:3)
如果您希望删除重复项(并保留顺序),则C ++惯用的方式是使用std :: set和std :: vector(此处仅显示示例的相关片段):
int a[] = {1,3,7,6,3,7};
std::set<int> c;
std::vector<int> b;
for(auto v: a)
if(c.insert(v).second)
b.push_back(v);
for(auto v: b)
std::cout << v << std::endl;
输出:
1
3
7
6
答案 1 :(得分:1)
您的代码应更改为此(两个代码段都将不遵循数组的顺序):
for (i = 0; i < n; i++) {
bool notDup = true;
for (j = i + 1; j < n; j++) {
if (a[i] == a[j]) {
notDup = false;
break;
}
}
if(notDup)
cout << "b= " << a[i] << endl;
}
但是,解决问题的更简单方法是构造一个std::set
,它将省略重复项。
vector<int> a{1,3,7,6,3,7};
set<int> b(a.begin(), a.end());
for (auto& elem : b)
{
std::cout<<elem<<'\n';
}
答案 2 :(得分:1)
使用std::unordered_set
跟踪已保留的元素。另外,请使用std::vector
而不是C样式的数组。
vector<int> a{1, 3, 7, 6, 3, 7},
b;
unordered_set<int> s;
for(auto i : a)
{
if (s.insert(i).second)
{
b.push_back(i);
}
}
答案 3 :(得分:0)
有很多方法可以从向量中删除重复项。
从Oblivion
解决方案中,简单的方法是将它们插入到集合中,然后从集合中获取价值。
vector<int> a{1,3,7,6,3,7};
set<int> b(a.begin(), a.end());
for (auto& elem : b)
{
std::cout<<elem<<'\n';
}
另一种方法是在STL中使用 unique 。如果您不想使用更多的内存,那么此解决方案非常理想。时间复杂度为O(nlogn)
。
vector<int> a{1,3,7,6,3,7};
sort(a.begin(), a.end());
a.erase(unique(a.begin(), a.end()), a.end());