#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 Я был в отъезде и не имел возможности отреагировать на измененный вопрос (именно поэтому я, вероятно, получил отрицательный ответ). Сейчас я добавил третью версию.