【问题标题】:C++ Find specific element in vector [duplicate]C ++在向量中查找特定元素[重复]
【发布时间】:2020-06-24 10:05:37
【问题描述】:

我有一个像下面这样的向量。

struct Personel {
    uint16_t personelId;
    uint8_t age;
}

std::vector<Personel> Personels;

想象一下添加 1000 个元素,如下所示。

Personel personel1;
personel1.personelId = 1;
personel1.age = 26;
Personels.push_back(personel1);
.
.
.
Personel personel1000;
personel1000.personelId = 1000;
personel1000.age = 42;
Personels.push_back(personel1000);

从代码中可以理解,personelId 将是唯一的。 如果不使用 for 迭代每个元素并进行比较,如何根据personelId 获得 index

以下代码不起作用:因为int 不是Personel

auto match = std::find(Personels.begin(), Personels.end(), 596);
int index = std::distance(Personels.begin(), match); //must return 596

【问题讨论】:

  • 不幸的是,与重复的问题相比,这个问题在提供更接近minimal reproducible example 的内容方面更好。无论如何,既然你已经得到了答案,我认为我不会因为重复而受到伤害。也许有人会找到更好的

标签: c++ vector


【解决方案1】:

对于find,您需要传递与向量值相同类型的值。其中一种方法是为 Personel 定义 oprator==,使用目标 ID 创建个人并使用 find。另一种是将 find_if 与 lambda 一起使用:

auto match = std::find_if(Personels.begin(), Personels.end(), [] (const Personel& v) {return v.personelId ==  596});
int index = std::distance(Personels.begin(), match); 

或者,您可以使用旧好的for )))

【讨论】:

  • Find_if 在速度上有优势吗?
  • @QweQwe 算法并不比手写循环快。它们与手写循环一样快。你可以在这里找到一个可能的实现en.cppreference.com/w/cpp/algorithm/find。优点不是速度,而是可读性和犯错的机会少
  • 与什么比较?与传递给find 结构相比,find_if 可能会因为开销较小而稍微快一些,但可以忽略不计。在我看来,distance 非常慢,差异更快(匹配 - Personels.begin()),而for 在你的情况下更快,因为你不需要重新计算迭代器来索引。
  • @AskoldIlvento 遍历 for
【解决方案2】:

正如您所注意到的,std::find 在这里不起作用,因为您只想根据人员 ID 进行比较,而忽略所有其他字段。

这正是std::find_if 的用途。它有一个附加参数,用于提供要在搜索期间使用的谓词。只需调用 find_if 并使用谓词检查给定元素的人员 ID 以查找您要查找的元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-05
    • 2020-07-12
    • 1970-01-01
    • 2017-04-15
    • 1970-01-01
    • 2021-04-04
    • 2021-05-24
    相关资源
    最近更新 更多