【问题标题】:What can I do to improve this search in a vector of pointers?我可以做些什么来改进指针向量中的搜索?
【发布时间】:2018-09-06 04:06:05
【问题描述】:

我的目标是检查Person* 的向量中是否存在名称为person_namePerson 对象。该向量按名称的字母顺序排序。制作一个临时的Person 是我见过的让这个lower_bound 调用与该名称一起工作的唯一方法。是否有更有效的方法来执行此操作,或者是否需要 temp 来执行比较?

//person_name is a string
Person temp(person_name);
auto it = lower_bound(personVec.begin(), personVec.end(), &temp, personCompare());
if (it != personVec.end() && (*it)->getName() == person_name) {}
else { return false;  }

【问题讨论】:

  • 如果您要经常查找名称,我建议使用 unordered_map。如果你不是,那么当你拥有的东西有效时,为什么还要担心找到不同的东西呢?把它放在一个辅助函数中然后忘记它,除非你分析它并且它是一个瓶颈。

标签: c++ search vector lower-bound


【解决方案1】:

不需要temp。您需要具有适当签名的比较器。

例如,当使用 Person*& 取消引用 personVec.begin() 结果时 而person_namePersonName 类型,那么你可以拥有这样的签名比较器:

bool compare(Person* const& a, PersonName const& b);

这里只是简单的函数,但其​​他具有此类签名的可调用函数也可以工作。然后你可以直接使用lower_boundperson_name

auto it = lower_bound(personVec.begin(), personVec.end(), person_name, compare);

您的一般问题是关于如何提高性能。这是不可能通过看到 4 行程序来暗示的。应该通过在数据量大的情况下对整个程序进行剖析并分析结果来发现。例如,personVec 的排序可能比 lower_bound 花费更多的时间。然后使用unordered_set 而不是vector 可以提供比优化vector 中的搜索功能更好的结果。

【讨论】:

  • unordered_map 看起来是正确的方法,但我不确定实施。 <Person*, string> 我用哈希函数和equals函数设置了它。 find() 使用第一个模板参数(键),就像 hash 和 equals 一样,但我想通过输入搜索 person_name 然后将迭代器获取到指针,我应该能够在没有 @ 的情况下做到这一点987654340@。你能详细说明一下吗? @退休忍者
  • 我应该澄清一下:我正在调查unordered_map,因为我读到它可能对我正在尝试做的事情有用,但如果足够的话我会使用unordered_set。跨度>
  • 您是否对具有高数据负载的现成完美产品进行了分析?否则,正确的方法是实现产品并在它完全正确之前忘记性能,然后对其进行分析并进行性能工作。只有这样你才知道你需要在unordered_set<P,H,K,A>unordered_map<S,P,H,K,A> 或任何其他容器中拥有什么。不要使用“我想要”,使用“我需要,因为……”(填补空白)。例如那个P,是否需要Person* 而不是Person?你需要 Person 实例是可变的,你需要它是动态多态的吗?
  • 在进行此步骤之前,我确保结果是正确的。我使用Person* 作为向量的原因是我正在制作一个以Person 作为节点类型的图形程序,并且我需要一个类似于此的实现 [stackoverflow.com/a/44859718/5181816] 才能访问所有节点和在可用时执行多项任务,例如连接和遍历。
  • 我想我想通了:unordered_map<string, Person*> 这让它在字符串上执行find(),然后迭代器通过it->second 访问Person
猜你喜欢
  • 2012-10-11
  • 2019-03-07
  • 1970-01-01
  • 1970-01-01
  • 2017-05-20
  • 1970-01-01
  • 2010-09-05
  • 1970-01-01
相关资源
最近更新 更多