Форум программистов, компьютерный форум CyberForum.ru

Проверить, состоят ли наборы из одних и тех же слов - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Найти в записной книжке телефон по фамилии http://www.cyberforum.ru/cpp-beginners/thread1346860.html
5 В записной книжке указаны фамилии и номера телефонов 30-ти человек. Составить программу которая определяет, есть ли в записной книжке телефон некоторого человека, и, если есть, печатает номер его телефона и фамилию.
C++ Вставить в матрицу столбцы из чисел –1 4 Дан двумерный массив целых чисел. Вставить в него столбец из чисел –1 перед каждым столбцом, количество четных элементов которого больше заданного числа. http://www.cyberforum.ru/cpp-beginners/thread1346859.html
C++ Получить общую стоимость проданных фирмой товаров за два месяца
3 Фирме принадлежат два магазина. Известна стоимость товаров, проданных в каждом магазине за каждый день в июле и августе, которая хранится в двух массивах. Получить общую стоимость проданных фирмой товаров за два месяца.
Получить все шестизначные счастливые номера меньшие n C++
2 Получить все шестизначные счастливые номера меньшие n. Счастливым называют такое шестизначное число, в котором сумма его первых трех цифр равна сумме его последних трех цифр. (Определить функцию для расчета суммы цифр трехзначного числа.)
C++ Напечатать все слова предложения в порядке неубывания их длин http://www.cyberforum.ru/cpp-beginners/thread1346856.html
1 Дано предложение. Напечатать все его слова в порядке неубывания их длин.
C++ Альтернативный алгоритм генерации псевдослучайных чисел на просторах инета обнаружил неплохой на мой взгляд алгоритм, малость по своему его оформил и вуаля :) зацените вроде работает проверял плюсы перед обычным рандомом: 1. вроде бы быстрее работает 2. генерит и отрицательные числа тоже (при необходимости можно просто отрезать их условием) 3. автоматический рандомайз 4. небольшая страховочка насчет неправильного использования (min > max) 5.... подробнее

Показать сообщение отдельно
Melg
416 / 152 / 62
Регистрация: 23.09.2013
Сообщений: 306
06.01.2015, 04:14     Проверить, состоят ли наборы из одних и тех же слов
Ключевые моменты реализации:
1) использование std::is_permutation из <algorithm> для определения является ли набор слов перестановкой
2) заполнение пользователем набора осуществляется копированием из потока с помощью std::copy_n
3) для хранения наборов используется вектор строк
4) все подзадачи разбиты на минимальные функции

Ограничения:
1) Требует поддержки 11 стандарта (компиляция с ключем -std=c++11)
2) Позволяет ввести и оценить наборы только 1 раз

Код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <vector>
#include <string>
#include <iostream>
#include <iterator>
#include <algorithm>
 
using SetOfWords = std::vector<std::string>;
 
void ShowUserInputWordsMessage(size_t number_of_words) {
  std::cout << "Please fill sets with " << number_of_words << " words\n";
}
 
std::vector<std::string> GetFilledSetOfWords(size_t number_of_words) {
  ShowUserInputWordsMessage(number_of_words);
  std::vector<std::string> words_set(number_of_words);
  std::copy_n(std::istream_iterator<std::string>(std::cin), number_of_words,
              std::back_inserter(words_set));
  return words_set;
}
 
void ShowSet(const SetOfWords &set) {
  std::copy(set.begin(), set.end(),
            std::ostream_iterator<std::string>(std::cout, " "));
  std::cout << '\n';
}
 
void ShowIsPermutationMessage(bool is_permutation) {
  std::cout << "is" << (is_permutation ? " " : " not ") << "permutation of\n";
}
 
bool IsPermutation(const SetOfWords &first, const SetOfWords &second) {
  return std::is_permutation(first.begin(), first.end(), second.begin());
}
 
void ShowIsPermutationSets(const SetOfWords &first, const SetOfWords &second) {
  ShowSet(first);
  ShowIsPermutationMessage(IsPermutation(first, second));
  ShowSet(second);
}
 
int main() {
  const size_t kNumberOfWordsInSet = 12;
  ShowIsPermutationSets(GetFilledSetOfWords(kNumberOfWordsInSet),
                        GetFilledSetOfWords(kNumberOfWordsInSet));
  return 0;
}
Пруф работоспособности на наборе являющимся перестановкой:
http://ideone.com/8ngK0U
Пруф работоспособности на наборе не являющимся перестановкой:
http://ideone.com/H3jrsA

Добавлено через 5 минут
Вольная версия преследующая целью минимально необходимое число строк для реализации задачи:
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
  string s1[12], s2[12];
  for (int i = 0; i < 12; ++i) { cin >> s1[i] >> s2[i]; }
  cout << (std::is_permutation(s1, s1 + 12, s2) ? "is permutation"
                                                : "is not permutation");
}
Пруф работоспособности на наборе являющимся перестановкой:
http://ideone.com/ALciqU
Пруф работоспособности на наборе не являющимся перестановкой:
http://ideone.com/thmaWs
 
Текущее время: 23:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru