如何解决我正在尝试将向量的第0个元素与其他元素进行比较,以删除与其相等的其他元素,但是得到了意外的输出
所以我想将向量的第0个元素与其他元素进行比较以查看它们是否相等,因为我想从向量中移除该元素值的其他实例。 {1,1,2,3,1}变成{1,2,3},这是我写的代码:
std::vector<int> arr = {1,1,5,1};
for (int k = 1; k < arr.size(); k++)
{
if(arr[0] == arr[k]) {
arr.erase(arr.begin() + k);
}
我期望的输出是:
155
由于应该删除第一个实例的所有实例,所以我得到的是:
1551
最后1个来自哪里,我该如何解决?
解决方法
循环编写不正确。
for (int k = 1; k < arr.size(); k++)
{
if(arr[0] == arr[k]) {
arr.erase(arr.begin() + k);
}
您至少应该写
for (int k = 1; k < arr.size(); )
{
if(arr[0] == arr[k])
{
arr.erase(arr.begin() + k);
}
else
{
++k;
}
}
但是在任何情况下,最好使用标准算法std :: remove。例如
arr.erase( std::remove( std::next( std::begin( arr ) ),std::end( arr ),arr[0] ),std::end( arr ) );
这是一个演示程序。
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
int main()
{
std::vector<int> arr = { 1,1,5,1 };
arr.erase( std::remove( std::next( std::begin( arr ) ),std::end( arr ) );
for ( const auto &item : arr ) std::cout << item << ' ';
std::cout << '\n';
return 0;
}
其输出为
1 5 5
,
问题在于,删除元素后,for循环的索引一直在增加。试想一下,k为1。您删除了arr [1]元素。之后,arr [1]为5,但索引增加到2。因此,实际上您需要再次检查arr [1],但是您不需要。因此,您可以跳过数组中的某些元素。
我建议仅在不擦除元素的情况下,用while循环替换for循环,并增加索引。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。