Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Whoops
21 / 7 / 3
Регистрация: 29.08.2014
Сообщений: 78
Завершенные тесты: 1
#1

Связать два вектора - C++

29.03.2016, 18:34. Просмотров 233. Ответов 3
Метки нет (Все метки)

Здравствуйте.Может кто подскажет,как реализовать такую задачу?
Есть два вектора: vector<string> и vector<int>.
В первом записан набор слов.В другом количество одинаковых слов в тексте.
К примеру:
vector<string> vector<int>
Hello_________________ 3
World_________________2
love__________________9

Теперь сам вопрос.Сортируя vector<int>, можно ли как то упорядочить в том же порядке vector<string>. Т.е. должно получиться:
vector<string> vector<int>
love__________________9
Hello_________________ 3
World_________________2
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.03.2016, 18:34
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Связать два вектора (C++):

Заменить первые два нулевые элементы заданного вектора В на два первых НЕ нулевые элементы этого вектора
Дано вектор В, состоящий из N действительных чисел. Заменить первые два нулевые...

Как связать два файла с кодами?
В одном файле вычисляется константа, которая используется при расчете функции в...

Два вектора
Привет. Задание такое: Считайте пять имен в вектор vector&lt; string&gt; name,...

Цикл и два вектора
Доброй ночи, суть задачи: два вектора в одни водится &quot;Имя&quot; во второй значение...

Сравнить два вектора размерности n
Как сравнить два вектора размерности n? Например вектор a(2,3,2) сравнить с...

Сформировать два вектора по условию
Ввести с клавиатуры целые числа M, N и вектор A=(a1, a2,...an), n=15. Вектор...

3
dcshowcousa
26 / 18 / 97
Регистрация: 22.10.2015
Сообщений: 303
30.03.2016, 03:32 #2
Ваша архитектура весьма ненадёжная. Лучше создать массив объектов структур/класса и у каждого объекта будет 2 поля: string и int
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4371 / 2346 / 654
Регистрация: 18.10.2014
Сообщений: 3,996
30.03.2016, 04:33 #3
Лучший ответ Сообщение было отмечено Whoops как решение

Решение

Как уже заметил dcshowcousa, если у вас есть такая возможность, то лучше было бы завести один единственный вектор пар "слово-счетчик" и сортировать по счетчику только его.

Однако, если вам заранее жестко задано, что данные хранятся в двух разных "параллельных" векторах

C++
1
2
  std::vector<std::string> words = { "Hello", "World", "love" };
  std::vector<int> counts = { 3, 2, 9 };
то традиционное универсальное решение такой задачи - разделить процедуру сортировки на два этапа:

1. Сгенерировать сортирующую перестановку в отдельном индексном массиве
2. Переупорядочить элементы обоих массивов в соответствии с этой перестановкой

Там способом можно синхронно отсортировать хоть два, хоть пять, хоть сто массивов.

Первый этап реализовать несложно

C++
1
2
3
  std::vector<size_t> index(words.size());
  std::iota(index.begin(), index.end(), 0); // 0, 1, 2, 3, 4 ...
  std::sort(index.begin(), index.end(), [&](size_t i, size_t j) { return counts[i] > counts[j]; });
Теперь у нас в массиве index содержится сортирующая перестановка типа "откуда": для i-того элемента результирующего массива значение index[i] говорит, из какого элемента исходного массива надо взять значение.

Осталось только по очереди применить эту перестановку к исходным массивам words и counts. К сожалению, стандартная библиотека не содержит готовой функции, которая умеет делать это in-place. Поэтому для простоты изложения я сформирую результат в новых промежуточных массивах words_sorted и counts_sorted

C++
1
2
3
4
5
6
7
8
9
10
11
12
  std::vector<std::string> words_sorted;
  std::vector<int> counts_sorted;
  
  std::for_each(index.begin(), index.end(), [&](size_t i) { words_sorted.push_back(words[i]); });
  std::for_each(index.begin(), index.end(), [&](size_t i) { counts_sorted.push_back(counts[i]); });
 
  // Разумеется можно просто за один проход
  // std::for_each(index.begin(), index.end(), 
  //   [&](size_t i) { words_sorted.push_back(words[i]); counts_sorted.push_back(counts[i]); });
 
  std::swap(words, words_sorted);
  std::swap(counts, counts_sorted);
Вот и все - ваши массивы words и counts теперь содержат правильно отсортированные данные.

Смотрите сами: http://coliru.stacked-crooked.com/a/4e029c5e470c3ad2

При желании, не составит труда написать и функцию перестановки исходных массивов прямо на месте, без создания дополнительных массивов words_sorted и counts_sorted.
2
Whoops
21 / 7 / 3
Регистрация: 29.08.2014
Сообщений: 78
Завершенные тесты: 1
30.03.2016, 07:03  [ТС] #4
TheCalligrapher, большое спасибо за подсказку.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2016, 07:03
Привет! Вот еще темы с решениями:

Можно ли сложить два вектора?
если можно то как?

Как связать два cpp файла в одном проекте (visual studio 2010)
Есть два программы: одна создает файл.txt, вторая читает из него данные и...

Дан вектор Z(n). Сформировать два вектора
Дан вектор Z(n). Сформировать два вектора: в первый включите элементы исходного...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru