背景
实际代码: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;
}
答案 0 :(得分:3)
如果类具有数据成员fullName的公共访问器,则可以应用标准算法std::find_if
。例如
例如
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;