假设我有一个人结构:
struct Person {
char name[100];
char surname[100];
unsigned int age;
};
我想找出最快的搜索方法,并找出另一个具有相同值(同名,同名,相同年龄)的结构是否已存在于向量中。
请记住,我在矢量中有数百万个。
由于
答案 0 :(得分:2)
这是一种可能性:
#include <iostream>
#include <string>
#include <vector>
#include <set>
#include <tuple>
struct Person {
std::string name;
std::string surname;
unsigned int age;
bool operator<(const Person &x) const
{
return std::tie(name, surname, age) < std::tie(x.name, x.surname, x.age);
}
};
int main()
{
std::vector<Person> v;
// ...
std::set<Person> s;
for (const auto &x : v)
{
auto i = s.insert(x);
if (!i.second)
{
// x is duplicated
}
}
}
对于您的评论,您可以通过以下方式对矢量进行排序:
std::sort(v.begin(), v.end()); // Operator < is overloaded
答案 1 :(得分:0)
根据问题中的评论,特别是
不,我是指一组描述10与2,12,54等重复或2重复到10,12,54
听起来你真正想要的数据结构是std::multimap
(如果你有C ++ 11并且不关心顺序,那么std::unordered_multimap
)。 Multimaps将使用M M.的解决方案来处理您自己必须完成的簿记(除了您必须维护一个具有重复描述的附加容器之外,这总体上很好)。 std::multimap
为您做额外的簿记。
#include <map> // or <unordered_map>
#include <string>
#include <tuple> // std::tie()
#include <utility> // std::make_pair()
struct Person {
std::string name;
std::string surname;
unsigned int age;
bool operator<(const Person &x) const
{
return std::tie(name, surname, age) < std::tie(x.name, x.surname, x.age);
}
};
extern bool tryReadNextPersonFromFile(Person &, size_t & record_id);
int main()
{
std::multimap<Person, size_t> persons;
Person p;
size_t rid;
while(tryReadNextPersonFromFile(p, rid)) {
persons.insert(std::make_pair(p, rid));
}
// ...
p = ...
size_t howMany = persons.count(p);
if(0 == howMany) { /* not found ... */ }
else {
auto eq_range = persons.equal_range(p);
for(auto it=eq_range.first; it != eq_range.second; ++it) {
size_t pRecordID = it->second;
// ...
}
}
}
为了简洁起见,我使用了很多C ++ 11语法(如auto
),但这个想法对于C ++ 03也同样适用。由于您之前可能没有听说过多重映射(或者至少不熟悉STL界面),请务必查看例如,some documentation关于您可以使用它做什么以及如何做。