[英]Sort a vector of vectors and count frequencies of unique occurences using the standard library
给定std::vector<std::vector<int>>
:
std::vector<std::vector<int>>
std::vector<int>
std::vector<int>
的频率(即计数 ) 我的问题是双重的:
我尝试了以下方法:
std::vector<std::vector<int>> responseVectors
{
{ 2, 3, 2 },
{ 3, 2, 3 },
{ 3, 2, 3 },
{ 3, 3, 3 },
{ 1, 2, 3 },
{ 1, 2, 3 },
{ 1, 2, 3 },
{ 2, 1, 2 },
{ 0, 1, 2 },
{ 2, 3, 2 },
{ 3, 2, 3 },
{ 3, 2, 3 },
{ 3, 3, 3 },
{ 1, 2, 3 },
{ 1, 2, 3 },
{ 1, 2, 3 },
{ 2, 1, 2 },
{ 0, 1, 2 }
};
std::vector<std::vector<int>> uniqueResponseVectors;
uniqueResponseVectors.reserve(responseVectors.size());
std::sort(responseVectors.begin(), responseVectors.end());
std::unique_copy(responseVectors.begin(), responseVectors.end(), std::back_inserter(uniqueResponseVectors));
std::vector<int> freqTotal;
freqTotal.reserve(uniqueResponseVectors.size());
for(auto&& vector : uniqueResponseVectors)
{
int count = std::count(responseVectors.begin(), responseVectors.end(), vector);
freqTotal.push_back(count);
}
输出应该是:
for(auto&& vector : uniqueResponseVectors)
{
for(auto&& value : vector)
{
std::cout << "\t" << value << "\t";
}
std::cout << "\n";
}
// Printed result for the `uniqueResponseVectors`:
//
// 0 1 2
// 1 2 3
// 2 1 2
// 2 3 2
// 3 2 3
// 3 3 3
// Similarly for the `freqTotal`:
//
// 2
// 6
// 2
// 2
// 4
// 2
附加背景:
当我针对更大的数据集尝试上面的代码时(即,大小为100000的responseVectors
和每个std::vector<int>
的大小为12),它很慢。
我还尝试通过调用std::unique
和erase()
来直接操作responseVectors
,以避免创建副本。 然后我使用了一个迭代器循环来std::count
一个唯一的std::vector<int>
出现的次数。 然而,这证明甚至更慢。
user463035818向我指出了YSC的优秀答案
和PaulMcKenzie进一步重申了选择适当数据结构的重要性
基于这一输入,我试图将YSC提供的解决方案纳入我的案例,以便更好地了解正在发生的事情。 它归结为使用std::map
这是一个有序的关联容器 :
std::map<std::vector<int>, int> SortAndCountOccurences(std::vector<std::vector<int>>& vectors)
{
std::map<std::vector<int>, int> result;
std::for_each(vectors.begin(), vectors.end(), [&result](auto const& vector) {
++result[vector];
});
return result;
}
具有以下用途:
std::vector<std::vector<int>> responseVectors
{
{ 2, 3, 2 },
{ 3, 2, 3 },
{ 3, 2, 3 },
{ 3, 3, 3 },
{ 1, 2, 3 },
{ 1, 2, 3 },
{ 1, 2, 3 },
{ 2, 1, 2 },
{ 0, 1, 2 },
{ 2, 3, 2 },
{ 3, 2, 3 },
{ 3, 2, 3 },
{ 3, 3, 3 },
{ 1, 2, 3 },
{ 1, 2, 3 },
{ 1, 2, 3 },
{ 2, 1, 2 },
{ 0, 1, 2 }
};
std::map<std::vector<int>, int> sortedVectors = SortAndCountOccurences(responseVectors);
哪个会输出:
for(auto&& vector : sortedVectors)
{
for(auto&& value : vector.first)
{
std::cout << "\t" << value << "\t";
}
std::cout << "-> x" << vector.second << " times" << "\n";
}
// 0 1 2 -> x2 times
// 1 2 3 -> x6 times
// 2 1 2 -> x2 times
// 2 3 2 -> x2 times
// 3 2 3 -> x4 times
// 3 3 3 -> x2 times
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.