2010-07-15 4 views
0

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

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

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 - это указатель, поэтому я могу понять, почему это не сработает, но * mary [5] [5] = что не разрешено ни из-за «нового», так?

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

Спасибо, ,

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

+0

Что значит «* mary [5] [5] = что не разрешено ни из-за« нового »? Просьба уточнить.Вероятно, вы ошибаетесь. – atzz

ответ

5

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

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

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

+1

Конечно, [как указывает FredOverflow] (http://stackoverflow.com/questions/3256910/assign-elements-in-vector-declared-with-new-c/3256933#3256933), их не так много что полезно динамически выделять «вектор». –

+0

ладно, спасибо. По какой-то причине у меня создалось впечатление, что вы не могли бы этого сделать, если бы выделили новое. (плюс я делал это неправильно, когда я это пробовал). Полагаю, я серьезно что-то неправильно понял. Спасибо за помощь по такому глупому вопросу. – Johnny

6

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

+0

Одна из оснований для этого - избежать необходимости копировать базовый векторный объект при его передаче между вызовами функций. –

+0

@jMerliN, 'std :: swap' –

+1

@jMerliN: передать по ссылке (-to-const) уже решает эту проблему ... – fredoverflow

2

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

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

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

Однако, если вы пишете это в C:

int (*array3)[100]; 

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

(*array3)[5] = 123; 

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

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

С каких это пор C имеет векторы? – fredoverflow

+0

С тех пор, когда это похоже == то же самое –

+0

Указатели и массивы в C не являются одинаковыми, см. «Expert C Programming». –

Смежные вопросы