我是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。
再次感谢,如果您有任何疑问,请先询问,而不是低估。
答案 0 :(得分:3)
仅基于std算法的解决方案:
std::sort
对列表进行排序。std::adjacent_find
和reverse iterators检测第一个与其前一个元素相同的元素。我怀疑它比这更简单。为了您的享受:
#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;
}
答案 1 :(得分:1)
您可以使用地图,作为上面评论的人,然后放置矢量的每个元素的出现次数。然后,通过自定义比较器获取最大元素。
#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