在vector-c ++中对重复项进行分组

时间:2017-10-18 11:19:53

标签: c++ vector

INPUT : [3,3,3,2,2,2,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0]

OUTPUT : [[3,3,3],[2,2,2],[1,1,1,1,1],[0,0,0,0,0,0,0,0,0,0]]

Input是int的向量,而Output是int的向量向量。目的是在时间方面以最有效的方式做到这一点。

我目前使用的解决方案是:

vector<vector<int> results;
vector<int> result;

for(int i = 0 ; i < list.size() - 1 ; i++ ){
    result.push_back(list[i]);
    if ( list[i] != list[i+1]){
        results.push_back(result);
        result.clear();
    }
}

result.push_back(list[list.size()-1]);
results.push_back(result);
  • 归功于:@kabanus

2 个答案:

答案 0 :(得分:0)

您应尽可能使用standard algorithm library

这是一种可能的实施方式:

template <class T>
auto make_clusters(std::vector<T>& v) -> std::vector<std::vector<T>>
{
    std::vector<std::vector<T>> clusters;

    auto cluster_begin = v.begin();
    while (cluster_begin != v.end())
    {
        auto elem = *cluster_begin;

        auto cluster_end = std::find_if(cluster_begin, v.end(),
                                        [&](int e) { return e != elem; });
        clusters.emplace_back(std::distance(cluster_begin, cluster_end), elem);

        cluster_begin = cluster_end;
    }

    return clusters;
}

答案 1 :(得分:-1)

你关闭了。你已经找到了你的边界问题,但考虑一下集群界面会发生什么:

..2,2,3,3...
    ^ ^
    i i+1

您将输入else(如果条件与原始else if完全相反,则不需要if)并忘记添加最后2。如果向量中没有重复项,例如

`{1,2,3,4}`

除了空集群,你不会添加任何东西!因此,您总是希望添加数字,而不是您在群集中或结束它。如果您要结束群集,想要添加并清除群集。

for(int i = 0 ; i < sorted.size()-1 ; i++ ){
    cluster.push_back(sorted[i]);
    if ( sorted[i] != sorted[i+1]){
        clusters.push_back(cluster);
        cluster.clear();
    }
}

最后,正如@ tobi303所提到的那样,最后一个元素缺失了。使用单个元素({3})的列表尤其明显。请注意,在任何情况下都不会添加最后一个群集,无论它是最后一个新元素还是最终群集。

因此,一旦我们退出for,我们需要再检查一次(不是真的) - 如果群集为空,则意味着最后一个元素不是它的一部分,而是一个新元素。否则,最后一个集群尚未添加,您需要将最后一个元素附加到它,然后添加集群。我把这个留给你了。