我试过使用unique
但unique
只删除重复项。
我的程序应该做的是例如列表包含1,2,2,2,3,4,4
. 我想只删除重复的数字对,输出应该是1,2,3
(删除一对 2 和 4)。
遍历数据并删除对(实时代码):
list<int> data{1, 2, 2, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 6};
for (auto i = data.begin(); i != data.end();)
{
auto n = std::next(i);
if (n == data.end())
break;
if (*i == *n)
{
i = data.erase(i);
i = data.erase(i);
}
else
i++;
}
输出
1 2 3 4 5 6
也1 2 3
为1 2 2 2 3 4 4
.
上面的代码从 C++11 开始工作,如果你没有,试试这个:
for (list<int>::iterator i = data.begin(); i != data.end();)
{
list<int>::iterator n = i;
n++;
if (n == data.end())
break;
if (*i == *n)
{
i = data.erase(i);
i = data.erase(i);
}
else
i++;
}
我建议使用sort
和unique
函数来做到这一点。
std::sort (my_vector.begin(), my_vector.end() );
std::vector<int>::iterator it;
it = std::unique (my_vector.begin(), my_vector.end() );
my_vector.resize( std::distance(my_vector.begin(),it) );
参考:http ://www.cplusplus.com/reference/algorithm/unique/ - 这有一个示例,您可以在其中predicate comparison
自定义unique
.
std::adjacent_find
编辑——如果您有兴趣删除连续元素,您可能还想看看。
编辑——如果您只关心删除连续元素,请先对列表进行排序,然后对其进行迭代。如果两个元素是连续的,则使用std::remove_if
或类似的方法删除它们。
您可以轻松地遍历列表。获取第一个项目并搜索其他项目以进行完全匹配,如果找到则将两者都删除。当循环结束时,您应该有一个没有任何对的列表。
如果你能想出一个不在你的列表中的哨兵值,这里有一个更通用的方法来处理这个问题。作为一个附带的好处,这可能在向量上效果更好,因为 vector::erase 非常慢。
#include <cassert>
#include <vector>
#include <iterator>
#include <iostream>
#include <algorithm>
template <class ITR>
void replace_pairs_with_sentinel(ITR begin, ITR end,
const typename std::iterator_traits<ITR>::value_type& sentinel)
{
// handle empty sequence
if ( begin == end ) return;
// ensure no sentinel values exist
assert ( std::find(begin, end, sentinel) == end );
ITR prev = begin++;
while ( begin != end ) {
if ( *begin == *prev ) {
*prev = *begin = sentinel;
}
prev = begin++;
}
}
int main (int argc, char* argv[])
{
int data[] = {1, 2, 2, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 6};
std::vector<int> v( data, data + sizeof(data) / sizeof(int) );
replace_pairs_with_sentinel( v.begin(), v.end(), -INT_MAX );
std::vector<int>::iterator end_itr = std::remove( v.begin(), v.end(), -INT_MAX );
v.resize( end_itr - v.begin() );
std::copy( v.begin(), v.end(), std::ostream_iterator<int>( std::cout, " " ) );
return 0;
}