Почему «новый вектор <int> [5]» не создает массив векторов?

У меня есть фрагмент кода, целью которого является создание массива векторов с использованием ключевого слова «новый». Таким образом, возвращаемые 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 и итераторами, назначаемыми указателю?

int *arr = new int(5); создает один int со значением 5.
Ted Lyngmo 22.03.2019 10:22

почему ты хочешь сделать это? vector<vector<int>>(5,vector<int>(5,0)) создаст вектор с вектором 5x5, каждое значение которого будет инициализировано равным 0. Вы можете использовать resize для динамической настройки размера, если вам нужно, я не вижу необходимости в новом.

Samer Tufail 22.03.2019 10:28

Название вопроса не соответствует тексту. Код в заголовке делает создает массив векторов.

P.W 22.03.2019 10:29

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

qoinqoder 22.03.2019 10:30

Пожалуйста, перечитайте вопрос, я исправил скобки. Спасибо.

qoinqoder 22.03.2019 10:32

@Samuel Tufail, я пытаюсь создать массив векторов и хочу присвоить адрес, сгенерированный таким образом, new указателю.

qoinqoder 22.03.2019 10:34
Почему вы пытаетесь создать массив векторов? Или наоборот, почему бы и нет std::array<std::vector<int>, 5>?
Caleth 22.03.2019 10:36
new vector<int>[5]делает создать 5 пустойvector<int>s. Как вы думаете, почему он создал только один?
Caleth 22.03.2019 10:37

@qoinqoder конечно, в этом случае вы создаете вектор и делаете: vector<vector<int>>* ptr = &vec поэтому создайте указатель и укажите его на исходный вектор .... все еще не знаете, зачем вам нужен новый.

Samer Tufail 22.03.2019 10:38

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

qoinqoder 22.03.2019 10:39

В таком случае посмотрите на первый комментарий @SamerTufail.

Ted Lyngmo 22.03.2019 10:40

@qoinqoder, тогда вы можете использовать vector<vector<int>>(N,vector<int>(N,0)), все равно будете делать то, что вы описываете, он должен делать, не делая new

Samer Tufail 22.03.2019 10:40

Я понимаю, что vector<vector<int>> сделает всю работу за меня. Просто любопытно узнать, как распределяется память и почему это не то же самое, что встроенные типы данных?

qoinqoder 22.03.2019 10:41

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

Samer Tufail 22.03.2019 10:43

@qoinqoder после того, как вы отредактировали свой вопрос, предпосылка вашего вопроса теперь неверна. new vector<int>[V]; создает массив векторов. Как вы думаете, почему это не так?

PeterT 22.03.2019 10:44

Одно отличие: вы не можете изменить размер массивов [], вы можете только заменить их другими. И это (приблизительно) то, что делает вектор, когда вы его увеличиваете

Caleth 22.03.2019 10:45

«Это не тип данных, это контейнер, содержащий данные». Это то, что я искал. Может быть, более развернутый ответ. Спасибо @Самуэль.

qoinqoder 22.03.2019 10:46
Почему «new vector<int>[5]» не создает массив векторов? Да.
Thomas Sablik 22.03.2019 10:52
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
18
589
2

Ответы 2

Это здесь:

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.

Я обновил (исправил скобку []), пожалуйста, просмотрите вопрос один раз. Спасибо.

qoinqoder 22.03.2019 10:35

Предположение неверно.

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

Другие вопросы по теме