循环上的向量迭代器不兼容
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->getEmployees().end()
(注意 !=
)而不是 i < comp->getEmployees().end()
您应该使用smart pointers 而不是所有那些原始指针。
请发布您遇到的确切错误。
您似乎使用了很多拥有指针。除了@user0042 的建议之外,问问自己,动态分配是否真的是每种情况下的最佳解决方案。值语义有很多好处。
【参考方案1】:
Company::getEmployees()
按值返回,这意味着对于comp->getEmployees().begin()
和comp->getEmployees().end()
,您将获得两个不同的临时vector
s 的两个迭代器,它们分别被复制(并将立即销毁,留下两个悬空的迭代器),迭代器根本不属于同一个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()
返回对向量的引用。
【讨论】:
以上是关于循环上的向量迭代器不兼容的主要内容,如果未能解决你的问题,请参考以下文章