按值删除向量中的元素
Posted
技术标签:
【中文标题】按值删除向量中的元素【英文标题】:Deleting an element in a vector by value 【发布时间】:2015-11-18 09:59:37 【问题描述】:我如何从 Flight 中检索一个对象以与 main 中的输入 (flightNumber) 进行比较?如何在 main 中声明属性类型?
编译时显示错误消息:invalid conversion of 'int' to '*Flight*'
agent1.delete(flightNumber);
。
class Flight
int FlightNumber
;
class TravelAgent
vector <Flight *> flightList;
;
void Agent::delete(Flight *obj)
vector<Flight*>::iterator ptr;
for(ptr=flightList.begin();ptr!=flightList.end();ptr++)
if((*Ptr)==obj)
flightList.erase(ptr);
break;
if ((ptr) == flightList.end())
cout<<"Flight not found"<<endl;
int main
Agent agent1;
int flightNumber;
cout<<"Enter the number of the flight: "<<flush;
in>>flightNumber;
agent1.delete(flightNumber);
【问题讨论】:
如果之前声明了条件,第二个fPtr
在哪里?另外,错误在哪一行?
flightNumber
是一个 int,您正试图将它传递给您的 Agent::delete
方法,该方法接受一个 Flight*
参数而不是一个 int。
@MohamadElghawi 是的,我知道这一点。那么,我的问题或任何类似的参考资料是否有任何可能的解决方案?
考虑改用std::unordered_map<int/* flight number*/, std::unique_ptr<Flight>>
。然后删除是微不足道的,其中包括内存管理。
显示 Flight 类。里面有 FlightNumber 成员变量吗?
【参考方案1】:
您可以在 Flight 类中添加(如果不存在)getter
class Flight
int FlightNumber;
public:
int getflightNumber() return flightNumber;
;
然后如下:-
void Agent::delete(int flightNumber)
vector<Flight*>::iterator ptr;
for(ptr=flightList.begin();ptr!=flightList.end();ptr++)
if(((*Ptr)->getflightNumber() == flightNumber)
flightList.erase(ptr);
break;
if ((fPtr) == listFlight.end())
cout<<"Flight not found"<<endl;
【讨论】:
我以前做过,但是 ptr 无法请求成员 getFlight ... 这是指针类型的(也许你打算使用'->' 方法 int getflightNumber();应该是公开的。可能你错过了。 我已经声明了,但仍然显示相同的结果。【参考方案2】:由于这里的代码功能不全,很难给你好的建议。
首先,您的错误发生是因为您使用int
类型的变量而不是Flight
类型调用(似乎是)成员函数void Agent::delete(Flight *obj)
。编译器无法将您的 Flight
对象解释为 int
,因此会引发错误。
其次,您想知道如何从对象中检索属性。我建议你看看 accessors 和 mutators。
如果您想检索 Flight
对象中保存的信息,您应该公开允许这样做的成员函数。
// in your header file
class Flight
private:
int flight_number;
public:
// retrieve flight number value
int get_flight_number(void) const;
// allow to set the flight number value
void set_flight_number(int new_flight_number);
// some other member functions
// in your source file
int Flight::get_flight_number(void) const
return this->flight_number;
void Flight::set_flight_number(int new_flight_number)
// let's do some verification (do whatever you want)
if (new_flight_number > 0)
this->flight_number = new_flight_number;
这样你就可以通过写来设置和访问你的flight_number
,例如:
void test_function(Flight *f)
if (f->get_flight_number() == 42)
// do some stuff
int main()
Flight *my_f = new Flight();
my_f->set_flight_number = 4242;
my_test_function(my_f);
现在,您有足够的信息可以开始了。
注意事项:
您大量使用指针。现代 C++ 强烈倾向于不!尝试使用引用或移动操作。您可以参考此页面获取信息:
cpp-reference - references cpp-reference - move semantics虽然对于初学者来说有点硬核。网络上到处都是很棒的文章。关于它
【讨论】:
【参考方案3】:您最初的错误在您的主要方法中。您需要对其进行更改,以便创建 Flight
类的实例,而不是将航班号传递给您的 delete
方法。
int main() // you are also missing parenthesis
Agent agent1;
int flightNumber;
cout<<"Enter the number of the flight: "<<flush; // I don't know what flush is but maybe you meant std::endl
cin>>flightNumber;
Flight flight(flightNumber);
agent1.delete(&flight); // delete takes a Flight* not an int
这要求您的 Flight 类具有适当的构造函数。
class Flight
public:
Flight(int flightNumber)
: flightNumber_(flightNumber)
private:
int flightNumber_;
;
然后在您的delete
方法中搜索您的向量以查找与您要从向量中删除的flightNumber_
具有相同flightNumber_
的Flight
实例。这将要求您的 Flight
类有某种方式返回它的 flightNumber_
成员变量。
这绝对不是最好的方法,而且与现代 C++ 标准相去甚远,但它应该能让你继续前进。
【讨论】:
以上是关于按值删除向量中的元素的主要内容,如果未能解决你的问题,请参考以下文章