C ++, я хочу знать, как выделить вектор памяти <pair <int, int>> * - PullRequest
0 голосов
/ 30 мая 2019

У меня есть ошибка _Has_unused_capacity () vector ... Я не знаю, как выделить динамическую память

Я пытаюсь push_back, но ошибка произошла

vector< pair<int, int> > * v;

void Some_Function(){
   int m=3;
   int idx1=1;
   int idx2=2;
   int idx3=3;

   for(int i = 0; i<m; i++) {
       v[idx1].push_back(make_pair(idx2, idx3));      
       v[idx2].push_back(make_pair(idx1, idx3));
   }
}

Ответы [ 2 ]

2 голосов
/ 30 мая 2019

У вас есть указатель на вектор, который указывает в никуда. Либо выделите память для вашего вектора (хотя и не рекомендуется), либо не используйте указатель.

vector< pair<int, int> > * v = new vector<pair<int, int>>[2];
V[idx].push_back(make_pair(idx2, idx3));

Не забудьте удалить свой вектор, когда закончите.

delete [] v;

Лучший способ - использовать умные указатели, вот пример с shared_ptr:

#include <iostream>

#include <vector>
#include <memory>

using namespace std;
using vecPair = vector<pair<int, int>>;

// deallocator for an array of vectors
void deleter(vecPair* x)
{
    delete[] x;
}

int main() {
    shared_ptr<vecPair> v;
    v.reset(new vecPair[2], deleter);
    int a = 1;
    int b = 2;
    int c = 3;
    int d = 4;
    v.get()[0].push_back(make_pair(a, b));
    v.get()[1].push_back(make_pair(c, d));
}
0 голосов
/ 30 мая 2019

Во-первых, я не рекомендую использовать указатель на контейнер.

Кроме того, элемент указатель может вызвать утечку памяти.

Но, если должен. Вы можете использовать std::vector<std::vector<std::pair<int, int>>

ИЛИ, auto vec = std::make_shared<std::vector<std::vector<std::pair<int, int>>>()

использование умного указателя может управлять памятью само по себе. std::make_shared поддерживается с C ++ 14

...