Проблема с пониманием векторной инициализации - PullRequest
1 голос
/ 31 мая 2019

Это может быть глупый вопрос, но есть кое-что, что я не совсем понимаю. При использовании вектора, когда я хочу «push_back» элемент в определенную позицию, я могу сделать это, только если я инициализирую вектор определенным образом.

Например, когда я использую эту инициализацию:

std::vector<int> Myvec;
int size = 0;
int x = 0;
std::cin >> size;

for(int i = 0; i < size; i++)
{
    std::cin >> x;
    Myvec[i].push_back(x);
}

Я получаю следующую ошибку: запрос на член 'push_back' в 'Myvec.std :: vector <_Tp, _Alloc> :: operator []> (((std :: vector :: size_type) i))', который имеет неклассный тип '__gnu_cxx :: __ alloc_traits> :: value_type {aka int} '|

Но когда я использую следующую инициализацию, она работает:

int size = 0;
int x = 0;
std::cin >> size;
std::vector<int> Myvec[size];

for(int i = 0; i < size; i++)
{
    std::cin >> x;
    Myvec[i].push_back(x);
}

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

Ответы [ 3 ]

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

В первом блоке вы должны использовать:

std::vector<int> Myvec;
int size = 0;
int x = 0;
std::cin >> size;

for(int i = 0; i < size; i++)
{
    std::cin >> x;
    Myvec.push_back(x);
}

Или вы можете использовать:

int size = 0;
int x = 0;
std::cin >> size;
std::vector<int> Myvec(size);
for(int i = 0; i < size; i++)
{
    cin>>Myvec[i];
}

И распечатать вектор, используя:

for(int i = 0; i < size; i++) {
     std::cout<< Myvec[i]<<" ";
}

КогдаВы инициализируете его, используя вектор Myvec [размер], он становится вектором векторов с размером «размер», что означает, что каждый Myvec [i] является вектором, в который вы можете помещать элементы.

Подробнее здесь: https://www.geeksforgeeks.org/2d-vector-in-cpp-with-user-defined-size/

0 голосов
/ 31 мая 2019

Вы не помещаете элемент в положение i в векторе.

Вы помещаете элемент в конец вектора i th в массиве векторов! Хуже того, массив пуст, поэтому доступ недействителен.

Если бы это было не так, вы бы получили i векторов, каждый из которых имеет один элемент. Не хорошо!

Вместо этого вы можете сделать свой вектор определенного размера:

MyVec.resize(SomeSize);

& hellip; затем назначьте элементы, как если бы вектор был массивом (который он вроде как):

MyVec[i] = thing;

Ключевым моментом здесь является то, что у вас нет до push_back; Вы делаете это только тогда, когда хотите вставить новый элемент в конец вектора. Вы можете получить доступ к существующим значениям с помощью синтаксиса [], подобного массиву, просто отлично.

Узнайте больше о векторах в вашей книге C ++.

0 голосов
/ 31 мая 2019

Вы неправильно понимаете, как работает функция std::vector::push_back. Это в основном добавляет новый объект в конце вектора. В частности, вам не нужно индексировать вектор с std::vector::operator[]. Вместо этого измените свой фрагмент на

for(int i = 0; i < size; i++)
{
    std::cin >> x;
    Myvec.push_back(x);
}

Решение, которое вы придумали, делает что-то, что вы, вероятно, не намереваетесь, то есть, используя необработанный массив векторов: при передаче пользовательского ввода в объекты, он создает size векторов с одним элементом в каждом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...