是否有任何STL功能可以做到这一点? 对于矢量:
4 4 5 5 6 7
由于一个2
6 and 7
如果没有STL功能,你会帮我算一下经典吗?
答案 0 :(得分:0)
如果性能和内存对您无关紧要,请使用std::map
(或无序版本)执行此任务:
size_t count(const std::vector<int>& vec){
std::map<int,unsigned int> occurenceMap;
for (auto i : vec){
occurenceMap[i]++;
}
size_t count = 0U;
for (const auto& pair : occurenceMap){
if (pair.second == 1U){
count++;
}
}
return count;
}
使用模板,可以推广到任何容器类型和任何容器类型。
答案 1 :(得分:0)
使用std :: unique计算唯一条目(ct_u),然后计算原始条目(ct_o)上的用户向量计数。差异ct_o-ct_u会给出答案。
P.S。:仅当相同的条目在原始向量中一起使用时才会起作用。如果没有,您可能需要先对矢量进行排序。
答案 2 :(得分:0)
我认为STL中没有算法。您可以按照建议复制到multimap
或使用map
个频率,但它会执行额外的工作,因为您的数组恰好已经排序。这是一个简单的算法,它计算奇异元素的数量,即在排序序列中只出现一次的元素。
int previous = v.front();
int current_count = 0;
int total_singular = 0;
for(auto n : v) {
if(previous == n) // check if same as last iteration
current_count++; // count the elements equal to current value
else {
if(current_count == 1) // count only those that have one copy for total
total_singular++;
previous = n;
current_count = 1; // reset counter, because current changed
}
}
if(current_count == 1) // check the last number
total_singular++;
您也可以将count_if
与状态lambda一起使用,但我不认为它会使算法变得更简单。
答案 3 :(得分:0)
使用算法:
std::size_t count_unique(const std::vector<int>& v)
{
std::size_t count = 0;
for (auto it = v.begin(); it != v.end(); )
{
auto it2 = std::find_if(it + 1, v.end(), [&](int e) { return e != *it; });
count += (it2 - it == 1);
it = it2;
}
return count;
}