присваивать элементы в векторе, объявленном с новым. C ++ - PullRequest
1 голос
/ 15 июля 2010

Я пытаюсь использовать большой 2D-вектор, который хочу выделить новым (потому что он большой).

, если я скажу:

vector< vector<int> > bob;
bob = vector< vector<int> >(16, vector<int>(1<<12,0));
bob[5][5] = 777;

, это работает.Но если я скажу:

std::vector< std::vector<int> > *mary;
mary = new vector< vector<int> >(16, vector<int>(1<<12, 0));
mary[5][5] = 777;

, это не сработает, и я получу ошибку:

Ошибка 1: ошибка C2679: бинарный '=': не найден оператор, который берет правую рукуоперанд типа 'int' (или нет приемлемого преобразования) c: \ Users \ jsparger \ Documents \ My Dropbox \ ARI \ VME_0.01 \ VME_0.01 \ V965.cpp 11 VME_0.01

Очевидно,Я новичок в C ++.Может кто-нибудь объяснить, какой синтаксис мне нужно использовать для выполнения этой операции.Мэри - это указатель, поэтому я понимаю, почему это не сработает, но * mary [5] [5] = все, что не разрешено из-за "нового", верно?

Спасибо за помощь.Этот вектор я сейчас и буду использовать, потому что моему маленькому мозгу с ++ он достаточно прост для понимания, но не стесняйтесь, дайте мне знать, если такой большой вектор - плохая идея и т. Д.

Спасибосвязка.

Редактировать: Я ошибаюсь по поводу "не разрешено из-за нового".Я не знаю, где я это неправильно истолковал, потому что это, очевидно, работает, и не будет иметь особого смысла, чтобы этого не делать.Спасибо.

Ответы [ 3 ]

6 голосов
/ 15 июля 2010

Векторы хранят свои элементы в куче, так или иначе. Нет смысла выделять сам векторный объект в куче, так как он очень мал (обычно 12 байтов на 32-битной машине).

6 голосов
/ 15 июля 2010

Если mary является указателем, то вам необходимо разыменовать его перед применением оператора индекса:

(*mary)[5][5] = 777;

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

2 голосов
/ 15 июля 2010

В простом C массивы и указатели похожи (не то же самое!), Что приводит к вашей путанице.В простом C, если у вас есть следующие объявления:

int array1[100];
int *array2 = (int *)malloc(100*sizeof(int));

, вы можете использовать array1 и array2 точно таким же образом.

int (*array3)[100];

Это нечто совершенно другое.Array3 теперь является указателем на массив, а не указателем на элементы массива, и если вы хотите получить доступ к элементу, вы должны написать это:

(*array3)[5] = 123;

В C ++ вы на самом делеДелая что-то подобное, вторая «Мэри» - это указатель на вектор, а не указатель на элементы в векторе.Поэтому вы должны написать это:

(*mary)[5][5] = 777;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...