У меня есть фрагмент кода, целью которого является создание массива векторов с использованием ключевого слова «новый». Таким образом, возвращаемые new адреса назначаются указателю типа vector.
vector<vector<int>> *adj = new vector<vector<int>>[V]; // creates a 2-D vector
vector<vector<int>> *adj = new vector<vector<int>>[V]; //creates a 1-D vector
Проводя аналогию с созданием встроенного массива типов данных,
int *arr = new int[V]; //creates an array of integers
приведенный ниже код должен создать массив векторов, содержащих целое число.
vector<int> *arr = new vector<int>[V]; //should create an array of vectors
Но на самом деле он создает вектор целых чисел.
Я упустил что-то здесь, связанное с STL и итераторами, назначаемыми указателю?
почему ты хочешь сделать это? vector<vector<int>>(5,vector<int>(5,0)) создаст вектор с вектором 5x5, каждое значение которого будет инициализировано равным 0. Вы можете использовать resize для динамической настройки размера, если вам нужно, я не вижу необходимости в новом.
Название вопроса не соответствует тексту. Код в заголовке делает создает массив векторов.
Если я могу отредактировать свой вопрос, замените все круглые скобки квадратными. Я не смог отредактировать вопрос после того, как опубликовал его.
Пожалуйста, перечитайте вопрос, я исправил скобки. Спасибо.
@Samuel Tufail, я пытаюсь создать массив векторов и хочу присвоить адрес, сгенерированный таким образом, new указателю.
std::array<std::vector<int>, 5>?
new vector<int>[5]делает создать 5 пустойvector<int>s. Как вы думаете, почему он создал только один?
@qoinqoder конечно, в этом случае вы создаете вектор и делаете: vector<vector<int>>* ptr = &vec поэтому создайте указатель и укажите его на исходный вектор .... все еще не знаете, зачем вам нужен новый.
Мне нужно новое, потому что значение внутри скобок принимается в качестве входных данных. может быть, я должен обновить его как N.
В таком случае посмотрите на первый комментарий @SamerTufail.
@qoinqoder, тогда вы можете использовать vector<vector<int>>(N,vector<int>(N,0)), все равно будете делать то, что вы описываете, он должен делать, не делая new
Я понимаю, что vector<vector<int>> сделает всю работу за меня. Просто любопытно узнать, как распределяется память и почему это не то же самое, что встроенные типы данных?
Это не тип данных, это контейнер, содержащий данные. Теперь вы уходите от тонкостей автоматического управления памятью и усложняете себе жизнь.
@qoinqoder после того, как вы отредактировали свой вопрос, предпосылка вашего вопроса теперь неверна. new vector<int>[V]; создает массив векторов. Как вы думаете, почему это не так?
Одно отличие: вы не можете изменить размер массивов [], вы можете только заменить их другими. И это (приблизительно) то, что делает вектор, когда вы его увеличиваете
«Это не тип данных, это контейнер, содержащий данные». Это то, что я искал. Может быть, более развернутый ответ. Спасибо @Самуэль.





Это здесь:
int *arr = new int(5);
Не создает массив 5ints. Он создает один int и инициализирует его 5. Вместо этого вы хотели:
int *arr = new int[5];
Точно так же с вектором вам нужно следующее:
vector<int> *arr = new vector<int>[5];
Вместо этого код new vector<int>(5); создаст один вектор с предварительно установленным размером 5.
Я обновил (исправил скобку []), пожалуйста, просмотрите вопрос один раз. Спасибо.
Предположение неверно.
new vector<int>[5]
создает массив из 5 элементов типа vector<int>.
Этот код действителен:
#include <vector>
#include <iostream>
int main() {
std::vector<int> *v = new std::vector<int>[5];
v[0].push_back(1);
v[0].push_back(2);
v[0].push_back(3);
v[0].push_back(4);
v[3].push_back(31);
v[3].push_back(32);
std::cout << v[0][1] << '\n';
std::cout << v[0][2] << '\n';
std::cout << v[3][1] << '\n';
std::cout << v[4].size() << '\n';
delete[] v;
return 0;
}
и выход
2
3
32
0
int *arr = new int(5);создает одинintсо значением 5.