Создание вектора из связанных списков? - PullRequest
2 голосов
/ 19 марта 2011

Как создать вектор из связанных списков?

Например, у меня есть структура свойств (для связанного списка), определенная следующим образом:

typedef struct property {
    string info;
    property* implication;
} property;

И тогда у меня есть объект класса:

class objects {
private:
    vector<property> *traits;
public:
    void giveProperty(property *x) {
    traits.push_back(&x);
    }
};

Где то, что я хочу сделать концептуально, это дать объекту определенные свойства, и у каждого свойства есть ряд последствий (которые представляют собой связанный список), которые я могу использовать позже. Но я получаю ошибку:

запрос на член 'push_back' в '((объекты *) this) -> objects :: traits', который имеет неклассный тип 'std :: vector> *'

У меня проблемы с тем, чтобы заставить это работать. Извините, если это неясно, если у вас есть вопросы, я постараюсь прояснить себя.

Ответы [ 5 ]

4 голосов
/ 19 марта 2011

в классе objects, вы объявили указатель на вектор свойств, когда вы действительно хотите вектор указателей свойств :

class objects {
private:
    vector<property*> traits;    // Note where * is
public:
    void giveProperty(property *x) {
        traits.push_back(x);    // Note that x is already a pointer, no need to take its address
    }
};
3 голосов
/ 19 марта 2011

Я не уверен, почему вы используете сырые указатели. Вы говорите, что хотите иметь связанный список, но вы нигде не реализуете это. Почему бы не использовать контейнер std::list для связанных списков и не потерять указатели в целом?

#include <string>
#include <vector>
#include <list>

using std::string;
using std::vector;
using std::list;

struct implication {
    implication(string name) : name(name) {}
    string name;
};

struct property {
    property(string info) : info(info) {}
    string info;
    list<implication> implList;
};

class object {
private:
    vector<property> traits;
public:
    void giveProperty(const property& x) {
        traits.push_back(x);
    }
};

int f() {
    object o;
    property p1("p1");
    property p2("p2");
    implication i("implic");

    p1.implList.push_back(i);
    p1.implList.push_back(implication("other implic"));

    o.giveProperty(p1);

    o.giveProperty(property("p3"));
}
0 голосов
/ 19 марта 2011

Ты понимаешь, что такое указатели?

vector<property*> *traits; 

Вы создаете указатель на вектор, а не вектор.Вам необходимо создать:

traits = new vector<property*>;

, а затем получить к нему доступ:

traits->push_back(x);
0 голосов
/ 19 марта 2011

Измените это

traits.push_back(&x);

на это:

traits->push_back(*x);

Или, возможно / возможно, вы захотите изменить это:

vector<property> *traits;

на это:

vector<property*> traits;

Я бы пошел на последний!

0 голосов
/ 19 марта 2011

Изменение -

vector<property> *traits;

до

vector<property*>  traits; // Needs to be the declaration.

Так как вы пытаетесь push_back обратиться к вектору traits.

void giveProperty(property *x) {
    traits.push_back(&x);
                     ^ Error : With the above modifications made, traits can hold
                       elements of type property*. By doing &x, you are trying to do
                       push_back pointer's address which in that case vector should
                       hold elements of type property**. So, just remove the & 
                       symbol before x while push_back because x is already of type
                       property*

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...