按值删除向量中的元素

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&lt;int/* flight number*/, std::unique_ptr&lt;Flight&gt;&gt;。然后删除是微不足道的,其中包括内存管理。 显示 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,因此会引发错误。

其次,您想知道如何从对象中检索属性。我建议你看看 accessorsmutators

如果您想检索 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++ 标准相去甚远,但它应该能让你继续前进。

【讨论】:

以上是关于按值删除向量中的元素的主要内容,如果未能解决你的问题,请参考以下文章

在mysql json中按值删除数组元素

二叉树中的查找操作(按值查找按位查找)

C++ - 在自定义数据类型向量中按值匹配和替换元素

我有不同的类,我想用这些类中的对象制作一个向量并按值对其进行排序

从末尾删除向量中的所有空元素

在删除指向动态分配对象的指针向量中的元素之前,我需要做啥?