2015-09-05 3 views
0

У меня есть два класса, назовем первый автомобиль, а другой - ShowRoom.Поиск и удаление указателей из векторов/списков

Что я хочу сделать, так это создать либо вектор, либо список, в котором я буду хранить указатели на объекты Car. Затем я хочу искать эти векторы/списки для определенного указателя (который будет передан как параметр функции removeCar()), а затем удалит этот объект вместе с его указателем из вектора/списка.

Я пытаюсь реализовать эту идею уже довольно давно, используя функции алгоритма «найти» и «удалить», но я продолжаю получать ошибки при преобразовании объектов. Я пытаюсь разыменовать указатель, но затем я получаю сообщение о том, как я передаю слишком много аргументов для «удаления».

Вот код реализован в функции ShowRoom Удалить:

list <Car*> inventory; 

void Delete(Car* BMW) 
{ 
    if (find(inventory.begin(),inventory.end(),BMW) != inventory.end()) 
     remove(inventory.begin(),inventory.end(),BMW); 
    else 
     cout << "Car not found" << endl; 
} 

Помощь по этому вопросу было бы весьма признателен.

+0

Вы почти ответили сами, просто создайте вектор, например: 'std :: vector cars;', затем просто сделайте 'cars.push_back (* pointer_to_Cars_object);'. Это позволит вам иметь вектор объектов Cars; Указатели указывают на объект, поэтому в теории они действительно являются просто адресом объектов Cars. Оттуда перебирать список можно только: 'for (auto it = cars.begin(); it! = Cars.end(); it ++)'. Это позволит вам перебирать список. Тело 'for' будет выполнять ваш алгоритм. – TimLayne

+0

1. Включите '', 2. используйте' std :: list :: remove' вместо 'std :: remove' –

+0

Попробуйте' inventory.remove (BMW); '. – molbdnilo

ответ

-1

Это всегда проблематично хранить обычные указатели в контейнерах STL. STL предназначен для хранения объектов, а не указателей. Сохранение указателей означает, что вы и STL получаете друг друга, так как вы оба пытаетесь вызвать конструкторы копирования и деструкторы.

Это та ситуация, в которой были изобретены общие указатели, они делают жизнь намного проще.

http://www.cplusplus.com/reference/memory/shared_ptr/

Я бы также посоветовал не используя указатель, чтобы определить свои автомобили. Это намного надежнее (меньше ошибок), чтобы предоставить каждому объекту автомобиля уникальный идентификатор и использовать его.

#include <iostream> 
#include <set> 
#include <memory> 
using namespace std; 

class Car 
{ 
public: 
    // Construct a Car, assigning it a unique ID 
    Car() 
    { 
     myID = lastID++; 
    } 
    // Cars are equivalent if they have the same ID 
    bool operator==(const Car& other) const 
    { 
     return myID == other.myID; 
    } 
    // Sort cars by ID 
    bool operator<(const Car& other) const 
    { 
     return myID < other.myID; 
    } 
    // access the IF 
    int getID() { return myID; } 
private: 
    int myID; 
    static int lastID; 
}; 

int Car::lastID = 0; 

typedef std::shared_ptr<Car> car_t; 
std::set< car_t> Inventory; 

void Delete(car_t BMW) 
{ 
    Inventory.erase(BMW); 
} 

int main() 
{ 
    car_t car0(new Car); 
    car_t car1(new Car); 
    car_t car2(new Car); 
    Inventory.insert(car0); 
    Inventory.insert(car1); 
    Inventory.insert(car2); 

    cout << "Current Inventory: "; 
    for(auto c : Inventory) 
    { 
     cout << c->getID() << ", "; 
    } 
    cout << endl; 

    Delete(car1); 

    cout << "Current Inventory: "; 
    for(auto c : Inventory) 
    { 
     cout << c->getID() << ", "; 
    } 
    cout << endl; 

    return 0; 
} 

В качестве дополнительной оптимизации я использую контейнер std :: set для вашего инвентаря. Это обеспечит, чтобы каждый автомобиль в инвентаре был уникальным и очень быстро обнаруживался в больших запасах.

+0

Помимо управления ресурсами, почему бы вам не использовать 'std :: unique_ptr' и' std :: shared_ptr'? Я предпочитаю unique_ptr/shared_ptr в большинстве случаев по регулярному указателю только потому, что он удалит(), как только он выйдет из сферы действия , – TimLayne

+0

Потому что он удалит только объект, если каждый указатель на объект будет удален, что предотвратит многие распространенные ошибки. Кроме того, STL предназначен для использования объектов, а не указателей, а общие указатели выглядят как объект для STL, снова предотвращая множество видов многочисленных ошибок, особенно для непреднамеренных исполнений конструкторов копирования. – ravenspoint

+0

ahh ok спасибо. Я на полпути через Bjarne Stroustrup на языке программирования C++, ежедневно изучая полезные вещи; Я все еще ноб. – TimLayne

Смежные вопросы