C ++, вектор объектов - PullRequest
       30

C ++, вектор объектов

0 голосов
/ 09 марта 2010

В c ++ хорошо ли использовать вектор объектов? Если нет, что не так с этим кодом C ++?

#include <vector>

using namespace std;

class A {};

int main() {

        vector<A*> v ( new A);
        return 0;
}

из g ++:

13: ошибка: неверное преобразование из A*' to unsigned int '

Ответы [ 4 ]

11 голосов
/ 09 марта 2010

Конструктор для std :: vector принимает начальную длину, а не элемент.

Это означает, что вы обычно делаете:

vector<A*> v(1); // Initialize to length 1
v.push_back( new A() ); // Add your element...

Вы получаете ошибку компилятора, потому что в вашей системе size_type определяется как unsigned int. Он пытается использовать этот конструктор, но безуспешно, так как вы передаете ему указатель на A.

4 голосов
/ 09 марта 2010

Вам необходимо прочитать документацию , прежде чем использовать что-то, чего вы не знаете.

Вот различные конструкторы для класса std::vector:

explicit vector ( const Allocator& = Allocator() );
explicit vector ( size_type n, const T& value= T(), const Allocator& = Allocator() );
template <class InputIterator>
         vector ( InputIterator first, InputIterator last, const Allocator& = Allocator() );
vector ( const vector<T,Allocator>& x );
2 голосов
/ 09 марта 2010

Вектор не имеет конструктора, который принимает один элемент для хранения.

Чтобы сделать вектор из одного элемента с заданным значением:

vector<A*> v ( 1, new A);

Что касается того, хорошо ли иметь вектор указателей для динамически размещаемых объектов - нет. Вы должны управлять этой памятью вручную.

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

1 голос
/ 09 марта 2010

Я бы порекомендовал не использовать std::vector, как это: управление памятью становится кошмаром. (Например, vector<A*> v ( 10, new A); имеет десять указателей, но только один выделенный объект, и вы должны помнить, чтобы освобождать его только один раз. Если вы вообще не освобождаете, у вас есть свободная память.)

Вместо этого рассмотрите возможность использования библиотеки Boost Pointer Container : вы можете передавать вновь выделенные объекты, и она будет обрабатывать все управление памятью за вас.

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