C++使用lower_bound从字符串创建哈希并将其存储在向量中

dm7nw8vv  于 2023-04-01  发布在  其他
关注(0)|答案(1)|浏览(122)

为了识别用户,我将创建一个散列,它也用于组织向量中的项目。但是当我使用del方法时,没有删除任何内容,我是C++的初学者,所以也许我忽略了一些基本的错误。提前感谢所有的评论。完整的程序https://onecompiler.com/cpp/3z3u8j6xc

class CPerson
    {
      ...
    };
    
    CPerson::CPerson(const string &name, const string &surname, const string &email, unsigned int salary )
    :   ...
        m_ID(hash<string>{}(name+surname))
    {
    }
    
    bool CPerson::operator == (const CPerson &person) const
    {
       return m_ID == person.m_ID;
    }
    

    bool CPerson::operator < (const CPerson& person) const 
    {
         return m_ID < person.m_ID;
    }
class CPersonalAgenda
{
  ...
      vector<CPerson> m_Employees;
};

bool CPersonalAgenda::add ( const string &name, const string &surname, const string &email, unsigned int salary )
{
  CPerson newEmployee(name, surname, email, salary);
  auto it = lower_bound(m_Employees.begin(), m_Employees.end(), newEmployee);

  if(it == m_Employees.end())
  {
    m_Employees.insert(it, newEmployee);
    return true;
  }
  
  return false;
}

bool CPersonalAgenda::del( const string &name, const string &surname)
{
  auto it = lower_bound(m_Employees.begin(), m_Employees.end(), CPerson(name,surname,"",-1));
  
  if(it != m_Employees.end())
  {
    m_Employees.erase(m_Employees.begin() + distance(m_Employees.begin(), it));
    return true;
  }

  return false;
}

int main ( void )
{
  CPersonalAgenda db;
  db.add("Marek", "Hamsik", "hamsik@email.cz", 585000); 
  db.add("Tomas", "Rosicky", "rosicky@email.cz", 585000); 
  db.add("Antonin", "Barak", "barak@email.cz", 585000); 
  db.add("TomaS", "Rosicky", "rosicky@email.cz", 585000);
 
  db.del("Marek", "Hamsik");
}
pxq42qpu

pxq42qpu1#

auto it = lower_bound(m_Employees.begin(), m_Employees.end(), newEmployee);
lower_bound在上面的调用中工作的前提是m_Employees在调用之前被排序。如果是这样,它会找到第一个m_Employee“〉= newEmployee”-这-对于你的operator<重载-意味着有一个更高的m_ID,或者如果所有现有元素都更小,则有end()
但是,然后你有...

if(it == m_Employees.end())
{
    m_Employees.insert(it, newEmployee);
    return true;
}

这意味着,如果所有现有元素都较小,那么您将newEmployee插入到(填充部分)向量的末尾,但如果newEmployee属于现有员工前面或之间的某个位置,该怎么办?您什么都不做,return false被忽略。要修复,alwaysinsert
后退一步-在vector中插入可能会很慢,因为需要插入到前面的任何现有元素都需要移动以为新元素腾出空间。您最好使用std::mapstd::unordered_map。不过,对于这种情况,只有当它是同一个员工时,你才需要operator==返回true。哈希值相同并不意味着它是同一个员工-你可以使用它作为快速检查,但偶尔不同的名称将产生相同的散列。

相关问题