Есть ли способ создать std :: vector из динамически распределенных массивов? - PullRequest
0 голосов
/ 26 апреля 2011

Например, возможно ли иметь std :: vector этих массивов?

int *test1 = new int[10];
int *test2 = new int[20];
int *test3 = new int[3];

Ответы [ 4 ]

2 голосов
/ 26 апреля 2011

Да, это возможно. Но поскольку вам нужно просто, сделайте это просто:

std::vector <std::vector<int> > myArrayVector(numberOfArrays);
myArrayVector[0].resize(10);
myArrayVector[1].resize(20);
myArrayVector[2].resize(3);

Везде, где вам нужно иметь int *, используйте & myArrayVector [i] [0], где i - индекс массива.

2 голосов
/ 26 апреля 2011

Да, это возможно, но почему бы просто не использовать vector<vector<int>>? Более гибкий и меньше проблем.

Если вы настаиваете на использовании массивов, shared_array в Boost может помочь уменьшить ручную работу по управлению памятью массива.

1 голос
/ 26 апреля 2011

Да.

std::vector<int*> vints;
vints.push_back(new int[10]);
vints.push_back(new int[20]);
vints.push_back(new int[3]);

Но есть проблема: вектор не может запомнить размер каждого динамически выделенных массивов.

Так что лучше использовать std:map as:

std::map<int, int*> arrayMap;
arrayMap[10] = new int[10];
arrayMap[20] = new int[20];
arrayMap[3] = new int[3];

Ключ этой карты сообщает размер соответствующего динамически выделенного массива.

Еще лучше: вектор вектора как:

std::vector<vector<int> > vecArray;

Я бы предпочел последний подход, если только у меня нет веских оснований переходить к более ранним, т.е. к контейнеру , динамически выделенных массивов.

1 голос
/ 26 апреля 2011

Это возможно. Попробуйте это.

vector<int*> vec;
vec.push_back(test1);
vec.push_back(test2);
vec.push_back(test3);

Edit: Не забудьте освободить память до того, как ваш вектор выйдет из области видимости.

for(int i = 0; i < vec.size(); i++){
    delete [] vec[i];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...