查找向量中是否存在相同结构的最快方法

时间:2013-03-15 22:37:55

标签: c++ c vector struct

假设我有一个人结构:

struct Person {
    char name[100];
    char surname[100];
    unsigned int age;
};

我想找出最快的搜索方法,并找出另一个具有相同值(同名,同名,相同年龄)的结构是否已存在于向量中。

请记住,我在矢量中有数百万个。

由于

2 个答案:

答案 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关于您可以使用它做什么以及如何做。