我需要一个std函数来检查在向量中有多少元素恰好出现一次

时间:2016-02-04 10:44:22

标签: c++ vector stl

是否有任何STL功能可以做到这一点? 对于矢量:

4 4 5 5 6 7

由于一个2

,预期输出应为6 and 7

如果没有STL功能,你会帮我算一下经典吗?

4 个答案:

答案 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;
}

Demo