【问题标题】:Vector iterator incomptible on loop循环上的向量迭代器不兼容
【发布时间】:2017-10-24 13:59:05
【问题描述】:

我有一个循环在我的向量中搜索员工的问题,使用自动,由于某种原因我得到向量迭代器不兼容,这里是函数:

Employee * searchEmp(int id,Company * comp)
{
    for(auto i = comp->getEmployees().begin(); i < comp->getEmployees().end(); ++i)
        if((*i)->getID()==id)
            return (*i);
    return NULL;
}

它总是因 ++i 部分的错误而崩溃。

几点说明:

  1. 每个员工都有一个 id。

  2. 列表中肯定有 1 项(getEmployees)。

  3. 循环应该遍历所有向量并找到一个 id 等于我正在寻找的 id 的员工。

公司标题:

#include "Manager.h"

class Company 
{
public:
    Company();
    Company(string name,string adress,Manager * ceo);
    void companyInfo();
    Manager * ceo;
    vector<Employee *> getEmployees();
    void addEmployee(Employee * worker);
private:
    string name;
    string adress;
    vector<Employee *> employees;

};

【问题讨论】:

  • 不相关:但在您的 for 条件下,您可能希望使用 i != comp-&gt;getEmployees().end()(注意 !=)而不是 i &lt; comp-&gt;getEmployees().end()
  • 您应该使用smart pointers 而不是所有那些原始指针。
  • 请发布您遇到的确切错误。
  • 您似乎使用了很多拥有指针。除了@user0042 的建议之外,问问自己,动态分配是否真的是每种情况下的最佳解决方案。值语义有很多好处。

标签: c++ algorithm search vector runtime-error


【解决方案1】:

Company::getEmployees() 按值返回,这意味着对于comp-&gt;getEmployees().begin()comp-&gt;getEmployees().end(),您将获得两个不同的临时vectors 的两个迭代器,它们分别被复制(并将立即销毁,留下两个悬空的迭代器),迭代器根本不属于同一个vector

如果按值返回是您的意图,那么您应该使用命名变量,例如

Employee * searchEmp(int id,Company * comp)
{
    auto v = comp->getEmployees();
    for(auto i = v.begin(); i < v.end(); ++i)
        if((*i)->getID()==id)
            return (*i);
    return NULL;
}

如果可能的话,或者让getEmployees通过引用返回,.e.g

class Company 
{
public:
    ...
    vector<Employee *>& getEmployees();
    ...
};

【讨论】:

    【解决方案2】:

    getEmployees() 按值返回向量。这意味着它是一个副本,而不是存储在类中的实际向量。所以当你这样做时

    for(auto i = comp->getEmployees().begin(); i < comp->getEmployees().end(); ++i)
    

    开始和结束迭代器属于两个不同的向量,它们都超出范围,因为它们是临时对象。

    要使用您所拥有的,您需要使 getEmployees() 返回对向量的引用。

    【讨论】:

      猜你喜欢
      • 2012-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多