Можно ли создать динамический массив, не зная его длину в С++?
Можно ли создать динамический массив не зная его длину? Вот ссылка на задачу(взята с задачника по питону) - https://pythontutor.ru/lessons/lists/problems/even_indices/ В ней не указывается длина массива, как ее можно решить?
Ответы (3 шт):
у меня такая же задача на c++ с сириуса вот как я ее решил:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n, i;
cin >> n;
vector<int> v(n);
for (i = 0; i < n; i++)
{
cin >> v[i];
}
for (i = 0; i < n; i += 2)
{
cout << v[i] << " ";
}
return 0;
}
вектор это массив не имеющий границ, можешь задать, можешь и не задавать. в оригинальной задаче вводилось число, показывающее количество элементов в массиве. он идет от 0 элемента до n-1, а не как обычный от 1 до n. Ответ на твой вопрос: "Можно ли создать динамический массив не зная его длину?" - да создать можно, да только программа не знает, когда остановиться, поэтому ей нужен стоп сигнал (грубо говоря), то, что будет завершать ввод чисел в бесконечный массив, называющийся вектор. в моем случае ввод завершается, когда ввели n элементов. Надеюсь, я тебе помог, если это так, оцени, пожалуйста, у меня нет репутации
Для этого есть vector и string, но в этой задаче они вообще не нужны:
#include <cstdio>
int main()
{
int x;
for (unsigned q=0; scanf("%d", &x) == 1; ++q)
if (!(q&1))
printf("%d ", x);
putchar('\n');
return 0;
}
Вам правильно пишут, что массив создавать не нужно, и можно сразу обрабатывать числа.
Но если хочется массив, то так:
#include <iostream>
#include <vector>
int main()
{
std::vector<int> list;
int elem;
while (std::cin >> elem)
list.push_back(elem); // Вот тут вместо вставки в массив можно сразу печатать.
// Как пропускать каждое второе число - сами разберетесь.
for (int x : list)
std::cout << x << '\n';
}
Или, более выпендрежное решение:
#include <iostream>
#include <iterator>
#include <vector>
int main()
{
std::vector<int> list(std::istream_iterator<int>(std::cin), {});
for (int x : list)
std::cout << x << '\n';
}
Оба варианта считывают до конца файла. Если хочется остановиться в конце строки, то так:
// #include <sstream>
std::string line;
std::getline(std::cin, line);
std::istringstream ss(line);
// Дальше берете одно из двух решений выше, и меняете там `std::cin` на `ss`.