按类的成员搜索类的向量

Posted

技术标签:

【中文标题】按类的成员搜索类的向量【英文标题】:Search a Vector of Classes by a member of the Class 【发布时间】:2014-02-27 23:18:34 【问题描述】:

背景:

实际代码:https://github.com/lmwunder/ElectorateProgram

我正在编写一个基本程序,将选举信息存储为数据结构分配的一部分。它应该允许用户跟踪候选人和他们收到的选票。用户可以在选举信息列表中添加、编辑或删除候选人,并且可以保存或加载列表本身。用户还可以创建新列表。

数据结构:

候选人表示如下:

class candidate

    // Data Members
    private: std::string fullName;
    private: unsigned votes;
    // Function Members
    /* Constructors and Destructors */
    /* Accessors and Mutators */
;

候选者被进一步存储在另一个类的向量中:

class electorateList

    private: bool isValid;
    private: bool isModified;
    private: std::vector<candidate> electorateData;

问题:

当用户想要编辑或删除候选人时,我会提示他们输入候选人的姓名,即std::string。但是,我不完全了解如何仅使用候选人的姓名来搜索候选人的std::vector。对我来说最明显的方法是使用内部提供的名称数据实例化临时“匹配”候选对象,并使用它与所有 std::vector 成员进行比较。

理想情况下,我会这样做:

// Find a candidate by name and return their position in the vector
std::vector<candidate>::iterator electorateList::find( std::string &name )

    std::vector<candidate>::iterator position = electorateData.end();
    // Binary search over all the vector elements
    // If candidate is matched ( found ), set the iterator to the position in the vector the match is
    /* position = // electorateData.at( whereEver );
    // Else, return the end iterator of the array
    return position;

【问题讨论】:

在每个成员之前放置访问说明符(如private)并不是很常见的做法。你只需要说一次。 使用std::lower_bound 只有在元素有序的情况下才能进行二分搜索。为什么不直接使用std::findstd::find_if 我的项目的另一部分在每次添加、编辑或删除操作后调用 sort() 成员,以确保所有成员都按升序排列。请参阅背景部分中的 GitHub 链接。 我必须在这里第二个克里斯。另外,我看了一下github页面,你写的不是C++……指针使用太多了。 (哦,不要调用排序,将项目插入到正确的位置......这会让你在插入时降低到 O(log n) 而不是 O(N^2)。 【参考方案1】:

您可以应用标准算法std::find_if,前提是该类具有对数据成员 fullName 的公共访问器。例如

例如

auto it = std::find_if( electorateData.begin(), electorateData.end(),
                        [&]( const candidate &c )  return ( c.fullNameAccessor() == name );  );

if ( it != electorateData.end() ) std::cout << "There is such candidate." << std::endl;

【讨论】:

正确答案,我只注意到他确实有正确排序的向量以使用std::lower_bound 形式的二进制搜索,并且他保持“已排序”不变量的方法很糟糕。 :-D 我希望有一个更灵活的对话,而不是仅仅问这样一个单一的、广泛的问题。

以上是关于按类的成员搜索类的向量的主要内容,如果未能解决你的问题,请参考以下文章

当我制作父类的向量时,如果我把一个孩子放在那里,孩子的成员会丢失吗? [复制]

C++从类的向量指针访问类的成员

使用向量访问类的成员

保持类的向量成员与类实例连续

编译类型向量类的私有成员时出错 - C++ [重复]

为了能够检查向量中包含的类的数据成员,我需要在 autoexp.dat 中输入啥?