循环上的向量迭代器不兼容

Posted

技术标签:

【中文标题】循环上的向量迭代器不兼容【英文标题】: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 部分的错误而崩溃。

几点说明:

    每个员工都有一个 id。

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

    循环应该遍历所有向量并找到一个 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 的建议之外,问问自己,动态分配是否真的是每种情况下的最佳解决方案。值语义有很多好处。 【参考方案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() 返回对向量的引用。

【讨论】:

以上是关于循环上的向量迭代器不兼容的主要内容,如果未能解决你的问题,请参考以下文章

向量迭代器不兼容...但是为啥呢?

opencv“向量迭代器不兼容”

C++ for-each 语句触发“向量迭代器不兼容”断言失败:this->_Getcont() == 0

字符串迭代器不兼容 boost::tokenizer

向量迭代器在赋值重载中不兼容

向量的C++参考