【问题标题】:Group duplicate items in vector - c++ [closed]对向量中的重复项进行分组-c ++ [关闭]
【发布时间】:2017-10-18 11:19:52
【问题描述】:

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]]

输入是一个整数向量,而输出是一个整数向量的向量。目的是在所花费的时间方面以最有效的方式做到这一点。

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

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

【问题讨论】:

标签: c++ vector


【解决方案1】:

你应该尽可能使用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;
}

【讨论】:

  • 谢谢博洛夫。如果不是一个 int,它是一个结构体,其中 struct.x 执行 int 在这里的功能,你能指出如何修改它吗?
  • @MacAhmed 完成。见编辑
【解决方案2】:

你已经接近了。您已经解决了边界问题,但请考虑在集群接口处发生的情况:

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

您将输入else(如果条件与原始if 完全相反,则不需要else 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,我们需要再做一次检查(不是真的)——如果集群是空的,这意味着最后一个元素不是它的一部分,而是一个新元素。否则,最后一个集群尚未添加,您需要将最后一个元素附加到它,然后添加集群。我把这个留给你。

【讨论】:

  • 您的代码仍然具有越界访问权限......
  • @tobi303 不,它没有:) 谢谢,我只是复制粘贴。
  • ...现在你错过了最后一个元素
  • @tobi303 正确。你知道你可以编辑我的答案,如果它足够接近的话。不过谢谢!
  • @kabanus - 对类似这样的东西进行测试:[2,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0] 结果是:[[2,0],[1,1]]。有什么想法吗?
猜你喜欢
  • 2013-10-15
  • 1970-01-01
  • 2020-12-15
  • 2020-10-30
  • 2015-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多