查找向量C ++的独特元素

时间:2019-05-08 04:45:15

标签: c++ algorithm c++11 c++14 c++17

是否有一种快速的方法来查找元素向量中的所有单个元素(仅出现一次)?向量中的所有元素都是单一的或双重的(出现两次)。我的答案是对所有元素进行排序,然后删除重复出现的元素。有更快的方法吗?

2 个答案:

答案 0 :(得分:2)

因此,对于足够小的n(<= 1e8)个排序和删除(使用std::sort()std::unique)方法,它仍然比哈希表要快。

示例代码:O(n log n)

vector<int>A = {1,2,3,1,2,5};
    sort(A.begin(),A.end());
    A.erase(unique(A.begin(),A.end()),A.end());
    for(int&x:A)
        cout<<x<<" ";

答案 1 :(得分:1)

如果您的元素是可哈希的,则可以使用std::unordered_map<T, int>来存储每个元素的计数,这将花费摊销的线性时间:

template<typename T>
std::vector<T> uniqueElements(const std::vector<T>& v) {
    std::unordered_map<T, int> counts;
    for(const auto& elem : v) ++counts[elem];
    std::vector<T> result;
    for(auto [elem, count] : counts)
        if(count == 1)
            result.push_back(elem);
    return result;
}

对于小列表,排序然后进行线性遍历可能仍会更快。 另外请注意,这会复制您的元素,在某些情况下可能也会很昂贵