📜  c++ 按属性在向量中查找对象 - C++ (1)

📅  最后修改于: 2023-12-03 14:59:49.077000             🧑  作者: Mango

C++ 按属性在向量中查找对象

在 C++ 中,我们可以使用向量(vector)来存储一组对象。有时候,我们需要在向量中查找某个对象,而不是按照元素位置进行访问。在本篇文章中,我们将讨论如何按属性在向量中查找对象。

准备工作

为了简化例子,我们用一个简单的类来表示每个对象:

class Person {
public:
    string name;
    int age;
    string occupation;
    
    // constructor
    Person(string name, int age, string occupation) {
        this->name = name;
        this->age = age;
        this->occupation = occupation;
    }
    
    // destructor
    ~Person() {}
};

接下来,我们创建一个向量来存储一组 Person 对象:

vector<Person> people {
    Person("Alice", 25, "Engineer"),
    Person("Bob", 30, "Developer"),
    Person("Charlie", 35, "Manager"),
    Person("David", 40, "CEO"),
    Person("Eve", 45, "CTO")
};
按属性查找对象

我们可以通过遍历向量来查找特定的对象。例如,如果我们想找到名字为 "Charlie" 的 Person 对象,我们可以使用以下代码:

Person charlie;
for (int i = 0; i < people.size(); i++) {
    if (people[i].name == "Charlie") {
        charlie = people[i];
        break;
    }
}

这段代码从头到尾遍历了向量,查找名字匹配的 Person 对象。虽然这种方法有效,但它并不是最好的解决方案,因为它的效率取决于向量的大小。当向量中的对象数量很大时,这种遍历方法会变得非常缓慢。

我们可以使用 STL 的算法库来改进这个解决方案。例如,我们可以使用 std::find_if 来返回查找条件为真的第一个元素。示例如下:

Person charlie = *find_if(people.begin(), people.end(), 
    [](const Person& p) { return p.name == "Charlie"; });

这段代码查找名字为 "Charlie" 的 Person 对象,并将其赋值给 charlie 变量。请注意,find_if 的第一个参数是要搜索的第一个元素的迭代器,第二个参数是最后一个元素的下一个迭代器。我们还传递了一个函数对象,该函数对象返回一个布尔值,指示当前元素是否匹配查找条件。

结论

使用 STL 的算法库可以极大地改进查找对象的效率。对于大型向量,遍历速度会变得非常缓慢,而使用算法库可以提高查找速度并节省时间。