Как вводить элементы в массив БЕЗ ввода? (C ++)

Вход: 5

long long n;
cin>>n;
long long a[n];
for(long long i=0;i<n;i++){
cin>>a[i];
}

Как мне ввести элементы массива без ввода n?

Вот что я ищу:

Ввод: 1,2,3,4,5

cout << a[0]

выход:

1

9

Решение

Стандартный цикл входного фильтра в C ++ while(cin >> a) — это будет читаться до тех пор, пока больше не будет ввода, или пока не произойдут другие плохие вещи:

#include <vector>
#include <iterator>
#include <iostream>
int main() {
std::vector<int> nums;
while (std::cin >> a) {
nums.push_back(a);
}
std::copy(nums.begin(), nums.end(), ostream_iterator<int>{cout, " "});
}

Вы также можете использовать один вкладыш с входными итераторами — самый короткий способ чтения элементов в векторе:

#include <vector>
#include <iterator>
#include <algorithm>
#include <iostream>

int main() {
std::vector<int> nums(std::istream_iterator<int>(std::cin), {});
std::copy(nums.begin(), nums.end(), std::ostream_iterator<int>{std::cout, " "});
}

Увидеть Идеальный пример здесь

Предполагая, однако, что вы хотите игнорировать всю эту удивительность C ++, категорически не рекомендуется ИМХО, вы можете просто:

#include <iostream>
int main() {
const int MAX_SIZE = 100;
int nums[MAX_SIZE];
int a;
int i=0;
while (std::cin >> a) {
nums[i++] = a;
}

// do your output
}

Обратите внимание, что вы будете:

  1. нужно угадать MAX_SIZE,
  2. или вручную обработать перераспределение, как только вы прочитаете больше элементов, чем MAX_SIZE;

Следовательно: используйте std::vector!!

7

Другие решения

Использовать std::vector<long long> a; вместо.

Тогда используйте long long temp;, cin >> temp;, а также a.push_back(temp);,

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

В эти дни классные кошки не беспокоятся о повторных push_back поскольку они доверяют реализации стандартной библиотеки C ++, чтобы сохранить память приятной и нефрагментированной для вас. Но если нужно, то std::vector позволяет установить начальный вместимость через его reserve метод: вы все еще можете увеличить свой вектор, если хотите.

4

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

string line;
getline(cin, line);
istringstream iss(line);
vector<long long> a;
long long tmp;
while (iss >> tmp) {
a.push_back(tmp);
iss.ignore(1, ',');
}

Demo.

Обратите внимание, как вышеизложенное использует std::vector<long long> вместо массива. Этот подход позволяет вам управлять хранилищем ваших данных с помощью простого вызова push_backи знать, сколько данных вы ввели, изучив size(),

1

Есть несколько способов. Наиболее важным является то, что если вы не знаете количество значений, вам нужно использовать контейнер, который может расти по мере необходимости. Для этого у вас есть std::vector (как уже упоминали другие).

Наивный способ использовать вектор и читать ввод будет что-то вроде

std::vector<int> vector;
while (!std::cin.eof())
{
int value;
std::cin >> value;
vector.push_back(value);
}

Но вышеприведенный цикл неверен!

Использование аналогичного подхода к вышеуказанному циклу (но работающему) было бы что-то вроде

std::vector<int> vector;
int value;
while (std::cin >> value)
{
vector.push_back(value);
}

Однако в C ++ есть много полезных служебных функций и классов, которые могут сделать его еще проще.

С использованием стандартный алгоритм функция std::copy и несколько итератор помощники (std::istream_iterator а также std::back_inserter) мы можем написать

std::vector<int> vector;
std::copy(std::istream_iterator<int>(std::cin),
std::istream_iterator<int>(),
std::back_inserter(vector));

Как отметил Пол-г, это может быть еще проще, поскольку существует перегрузка конструктора вектора это занимает диапазон итератора, так что все, что действительно нужно, это

std::vector<int> vector(std::istream_iterator<int>(std::cin),
std::istream_iterator<int>());
1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector