Как создать массив / вектор из пар 2 соответствующих целых чисел из 2 разных строк пользовательского ввода в C ?

#c #arrays

#c #массивы

Вопрос:

Как соединить соответствующие элементы из двух разных строк ввода, чтобы сформировать один массив пар в C ?

Например. ввод :

 0 1 2 3 4
5 6 7 8 9

output = [{0,5} {1,6} {2,7} {3,8} {4,9}]
  

Редактировать :
Ввод задается пользователем через stdin, а не в виде 2 разных массивов.
Я хочу сохранить этот ввод непосредственно в виде массива пар без предварительного создания 2 массивов, а затем создания пар.

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

 vector<pair<int, int>> pairs;
for (int i = 0; i < n; i  ) {
        cin >> k;
        pairs.push_back({k, 0});
    }
for (int i = 0; i < n; i  ) {
        cin >> k;
        pairs[i] = {pairs[i].first, k};
    }
  

TIA.

Комментарии:

1. Почему не простой for цикл? Вы можете попытаться опубликовать пример такой простой реализации, чтобы мы могли отреагировать на него

2. @Damien ввод не в виде уже созданных массивов, а вводится пользователем. Я хочу сохранить эти данные в виде массива пар, без необходимости сначала создавать 2 массива для хранения входных данных, а затем формировать пары.

3. Почему в первой строке вопроса говорится, что данные находятся в двух массивах, но в редактировании говорится, что они не в массивах?

4. Либо это в массивах, либо нет, вопрос не должен описывать две разные проблемы.

5. Могу я спросить, в чем ваша причина сделать это эффективно? Эффективно — это что-то вроде вычисления миллиардов вещей друг за другом. Если вы реализуете это неэффективно (и расставляете приоритеты, такие как удобочитаемость), все, что требуется для выяснения отношений, все равно будет выполнено в тот момент, когда пользователь убрал палец с клавиши возврата.

Ответ №1:

Пересматривая свою попытку, вы должны обновить пару во втором цикле, а не заменять ее.

 vector<pair<int, int>> pairs;
for (int i = 0; i < n; i  ) {
    cin >> k;
    pairs.emplace_back(k, 0);
}
for (int i = 0; i < n; i  ) {
    cin >> pairs[i].second;
}
  

Комментарии:

1. Сильно ли это отличается от сохранения ввода в 2 массива сначала?

2. @Karmah24 Вы должны где-то сохранить первую строку. Но это избавляет вас от необходимости писать циклы для превращения строк в массивы.

3. Я внес правку, показывая, что я пробовал, не могли бы вы предложить что-то в этом роде и, возможно, указать, почему то, что я пробовал, не работает?

4. Во втором цикле вы могли бы просто сделать pairs[i].second = k; вместо создания новой пары. В противном случае первый набор пар — это дополнительное пространство для промежуточных значений.

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

Ответ №2:

Это пересмотренный ответ, поскольку вопрос сильно изменился.

Если размер известен, создайте результат vector<pair<int, int>> с правильным размером с самого начала, затем используйте два цикла for на основе диапазона со структурированными привязками, чтобы заполнить его.

 std::vector<std::pair<int, int>> res(number_of_pairs);

for(autoamp;[a, b] : res) if(!(std::cin >> a)) return 1;
for(autoamp;[a, b] : res) if(!(std::cin >> b)) return 1;
  

Комментарии:

1. Извините, мой вопрос не был ясен раньше, я внес некоторые изменения. Ввод вводится пользователем. и я хочу сохранить его непосредственно в виде массива пар вместо того, чтобы сначала создавать 2 массива, а затем формировать пары.

2.@Karmah24 Итак, вы могли бы заставить пользователя вводить 0 5 1 6 etc?

3. @Karmah24 Я был в отъезде и не имел возможности отреагировать на измененный вопрос (именно поэтому я, вероятно, получил отрицательный ответ). Сейчас я добавил третью версию.