gpt4 book ai didi

c++ - std::vector 中的重复元素

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:26:06 24 4
gpt4 key购买 nike

我有一个 std::vector,我想检查其中的所有元素。如果某个元素出现不止一次,我会发出错误信号。

我是这样做的:

std::vector<std::string> test;
test.push_back("YES");
test.push_back("YES");

for(int i = 0; i < test.size(); i++)
{
if(test[i] > 1)
{
DCS_LOG_DEBUG("ERROR WITH COUNT")
}
}

尽管我知道如何使用 std::vector::count() 方法进行计数,但这并没有奏效。但我想计算每个元素的数量,而不是计算所有元素……有什么想法吗?

最佳答案

最简单的方法是对 vector ​​进行std::sort,然后使用std::adjacent_find


但是,如果你不想对 vector 进行排序,你可以在 C++11 中做这样的事情:

#include <unordered_map>
#include <functional> // For std::hash<std::string>.
#include <string>
#include <iostream>

int main() {

// Test data.
std::vector<std::string> v;
v.push_back("a");
v.push_back("b");
v.push_back("c");
v.push_back("a");
v.push_back("c");
v.push_back("d");
v.push_back("a");

// Hash function for the hashtable.
auto h = [](const std::string* s) {
return std::hash<std::string>()(*s);
};

// Equality comparer for the hashtable.
auto eq = [](const std::string* s1, const std::string* s2) {
return s1->compare(*s2) == 0;
};

// The hashtable:
// Key: Pointer to element of 'v'.
// Value: Occurrence count.
std::unordered_map<const std::string*, size_t, decltype(h), decltype(eq)> m(v.size(), h, eq);

// Count occurances.
for (auto v_i = v.cbegin(); v_i != v.cend(); ++v_i)
++m[&(*v_i)];

// Print strings that occur more than once:
for (auto m_i = m.begin(); m_i != m.end(); ++m_i)
if (m_i->second > 1)
std::cout << *m_i->first << ": " << m_i->second << std::endl;

return 0;

}

这打印:

a: 3
c: 2

我实际上并没有对它进行基准测试,但由于以下原因,它有可能表现得相当好:

  • 假设实际的 vector 元素不会产生病态的不平衡散列,这实际上是一个 O(n) 算法,而不是用于排序的 O(n*log(n))。
  • 我们使用字符串的指针哈希表,而不是字符串本身,因此不会发生不必要的复制。
  • 我们可以“预分配”哈希表桶(我们在构造 m 时传递 v.size()),因此哈希表调整大小最小化。

关于c++ - std::vector 中的重复元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9683488/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com