3

我试过使用uniqueunique只删除重复项。

我的程序应该做的是例如列表包含1,2,2,2,3,4,4. 我想只删除重复的数字对,输出应该是1,2,3(删除一对 2 和 4)。

4

4 回答 4

5

遍历数据并删除对(实时代码):

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 31 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++;
}
于 2013-05-05T09:57:26.893 回答
1

我建议使用sortunique函数来做到这一点。

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或类似的方法删除它们。

于 2013-05-05T09:46:51.657 回答
0

您可以轻松地遍历列表。获取第一个项目并搜索其他项目以进行完全匹配,如果找到则将两者都删除。当循环结束时,您应该有一个没有任何对的列表。

于 2013-05-05T09:41:33.417 回答
0

如果你能想出一个不在你的列表中的哨兵值,这里有一个更通用的方法来处理这个问题。作为一个附带的好处,这可能在向量上效果更好,因为 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;
}
于 2013-05-05T14:31:21.430 回答