在向量中排除非重复的int

时间:2017-08-12 19:20:04

标签: c++ vector

我是C ++的新手,我来自Swift背景,我非常感谢你的帮助。

我有一个包含int值的向量。其中一些是重复的 我的任务是从向量中获取最大的重复值。

示例:

std::vector<int> myVector;
myVector.push_back(1);
myVector.push_back(8);
myVector.push_back(4);
myVector.push_back(4);

我需要一个返回4的函数,因为它是向量中最大的重复int。

再次感谢,如果您有任何疑问,请先询问,而不是低估。

3 个答案:

答案 0 :(得分:3)

仅基于std算法的解决方案:

  1. 使用std::sort对列表进行排序。
  2. 对其元素进行向后迭代,并使用std::adjacent_findreverse iterators检测第一个与其前一个元素相同的元素。
  3. 我怀疑它比这更简单。为了您的享受:

    #include <algorithm>
    #include <iostream>
    #include <vector>
    
    int main()
    {
        std::vector<int> v{1,2,3,3,4,4,4,5,6,7,7,8};
    
        std::sort(v.begin(), v.end());
        auto result = std::adjacent_find(v.rbegin(), v.rend());
    
        if(result == v.rend())
            std::cout << "No duplicate elements found.";
        else
            std::cout << "Largest non-unique element: " << *result;
    }
    

    Live example on Coliru。 属性:

    • 如果列表可以就地排序,则空间开销为零。
    • 复杂性:O(N log(N))小于比较和K等式比较,其中K等于大于您所追求的唯一元素的数量。
    • 构成算法的代码行:2

答案 1 :(得分:1)

您可以使用地图,作为上面评论的人,然后放置矢量的每个元素的出现次数。然后,通过自定义比较器获取最大元素。

Ideone

#include <iostream>
#include <algorithm>
#include <map>
#include <vector>

int largestRepeatingNumber(const std::vector<int> & vec)
{
    std::map<int, int> counter;

    std::for_each(std::begin(vec), std::end(vec), [&counter] (int elem) {
        counter.find(elem) == counter.end() ? counter[elem] = 1 : ++counter[elem]; });

    return std::max_element(std::begin(counter), std::end(counter), [] (auto lhs, auto rhs) {
         if (lhs.second == rhs.second)
            return lhs.first < rhs.first;
        return lhs.second < rhs.second;
    })->first;
}

int main()
{
    std::vector<int> myVector;
    myVector.push_back(1);
    myVector.push_back(8);
    myVector.push_back(4);
    myVector.push_back(4);
    myVector.push_back(3);
    myVector.push_back(3);
    std::cout << largestRepeatingNumber(myVector);

    return 0;
}

答案 2 :(得分:0)

我使用了下限和上限

所以战略是

1)对原始矢量进行排序(这样就可以使用独特的功能)

2)找到唯一(将唯一值复制到矢量,以便我们可以使用它来查找原始矢量中的值,而不是额外搜索)

3)找出最大距离

的下限和上限值

例如1 4 4 8

4将有最大距离

5)使用计数作为索引存储在地图中(地图是有序的,因此最大重复值将在最后)

#include<iostream>
#include<algorithm>
#include<vector>
#include<map>

using namespace std;

int main()
{


    std::vector<int> myVector,myvec,counter;
    map<int,int> maxdupe;

    myVector.push_back(1);
    myVector.push_back(8);
    myVector.push_back(4);
    myVector.push_back(4);

    sort(myVector.begin(),myVector.end());
    std::unique_copy(myVector.begin(), myVector.end(), std::back_inserter(myvec));
    std::copy(myvec.begin(), myvec.end(), std::ostream_iterator<int>(std::cout, " "));
    cout<<endl;

    for(auto i = myvec.begin(); i!=myvec.end();i++)
    {
    auto lower = std::lower_bound(myVector.begin(), myVector.end(), *i);
    auto upper = std::upper_bound(myVector.begin(), myVector.end(), *i);
    maxdupe[upper - lower] = *i;
    }

    for(auto i= maxdupe.begin();i!= maxdupe.end();i++)
    {
        cout<<i->first<<i->second<<endl;
    }



  return 0;

}

输出

1 4 8 
18
24
Program ended with exit code: 0