Использованные источники
1) Бьёрн Страуструп – Язык программирования С++, 1986г.
2) Скотт Майерс - Эффективный и современный С++, 2014г.
Приложение
1. Реализация с массивами символов
#include <cstring>
#include <iostream>
#include <locale>
#include <chrono>
void findIntersection(const char* arr1, const char* arr2, std::string &result) {
int k = 0; // Индекс для записи пересечения в result
// Для каждого элемента в arr1 проверяем, есть ли он в arr2
for (int i = 0; i < strlen(arr1); ++i) {
for (int j = 0; j < strlen(arr2); ++j) {
if (arr1[i] == arr2[j]) {
// Проверяем, не был ли этот элемент уже добавлен в результат
bool alreadyExists = false;
for (int l = 0; l < k; ++l) {
if (result[l] == arr1[i]) {
alreadyExists = true;
break;
}
}
// Если элемент не добавлен ранее, добавляем его в результат
if (!alreadyExists) {
result[k++] = arr1[i];
}
break; // Достаточно найти одно совпадение
}
}
}
result[k] = '\0'; // Завершаем строку нулевым символом
}
// Функция для нахождения объединения двух массивов символов
void findUnion(const char* arr1, const char* arr2, std::string &result) {
int k = 0; // Индекс для записи в result
// Добавляем все уникальные элементы из arr1 в result
for (int i = 0; i < strlen(arr1); ++i) {
// Проверяем, не был ли этот элемент уже добавлен в результат
bool alreadyExists = false;
for (int l = 0; l < k; ++l) {
if (result[l] == arr1[i]) {
alreadyExists = true;
break;
}
}
// Если элемент не добавлен ранее, добавляем его в результат
if (!alreadyExists) {
result[k++] = arr1[i];
}
}
// Добавляем все уникальные элементы из arr2 в result
for (int i = 0; i < strlen(arr2); ++i) {
// Проверяем, не был ли этот элемент уже добавлен в result
bool alreadyExists = false;
for (int l = 0; l < k; ++l) {
if (result[l] == arr2[i]) {
alreadyExists = true;
break;
}
}
// Если элемент не добавлен ранее, добавляем его в результат
if (!alreadyExists) {
result[k++] = arr2[i];
}
}
result[k] = '\0'; // Завершаем строку нулевым символом
}
// Функция для нахождения разности двух массивов символов
void findDifference(const char* arr1, const char* arr2, std::string &result) {
int k = 0; // Индекс для записи в result
// Проходим по каждому элементу arr1
for (int i = 0; i < strlen(arr1); ++i) {
bool foundInArr2 = false;
// Проверяем, есть ли этот элемент в arr2
for (int j = 0; j < strlen(arr2); ++j) {
if (arr1[i] == arr2[j]) {
foundInArr2 = true;
break; // Элемент найден во втором массиве, пропускаем его
}
}
// Если элемент не найден во втором массиве, добавляем его в результат
if (!foundInArr2) {
result[k++] = arr1[i];
}
}
result[k] = '\0'; // Завершаем строку нулевым символом
}
int main()
{
auto start = std::chrono::system_clock::now();
setlocale(LC_ALL, "russian");
char a[] = { "РУДЕНСКИЙ" };
char b[] = { "ЧЕТВЕРТАК" };
char c[] = { "КИРЕЙКОВА" };
char d[] = { "КОТОВ" };
std::string bcIntersect;
bcIntersect.resize(20);
findIntersection(b, c, bcIntersect);
std::cout << bcIntersect << std::endl;
std::string abcUnion;
abcUnion.resize(20);
findUnion(a, bcIntersect.c_str(), abcUnion);
std::cout << abcUnion << std::endl;
std::string abcdDiff;
abcdDiff.resize(20);
findDifference(abcUnion.c_str(), d, abcdDiff);
std::cout << abcdDiff << std::endl;
auto end = std::chrono::system_clock::now();
auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
std::cout << elapsed.count() << '\n';
}
2. Реализация со списком
#include <iostream>
#include <list>
#include <algorithm>
#include <locale>
#include <chrono>
// Функция для нахождения пересечения двух списков
void findIntersection(const std::list<char>& list1, const std::list<char>& list2, std::list<char>& result) {
for (char c : list1) {
if (std::find(list2.begin(), list2.end(), c) != list2.end()) {
if (std::find(result.begin(), result.end(), c) == result.end()) {
result.push_back(c);
}
}
}
}
// Функция для нахождения объединения двух списков
void findUnion(const std::list<char>& list1, const std::list<char>& list2, std::list<char>& result) {
result = list1;
for (char c : list2) {
if (std::find(result.begin(), result.end(), c) == result.end()) {
result.push_back(c);
}
}
}
// Функция для нахождения разности двух списков
void findDifference(const std::list<char>& list1, const std::list<char>& list2, std::list<char>& result) {
for (char c : list1) {
if (std::find(list2.begin(), list2.end(), c) == list2.end()) {
result.push_back(c);
}
}
}
// Функция для вывода списка
void printList(const std::list<char>& list) {
for (char c : list) {
std::cout << c;
}
std::cout << std::endl;
}
int main() {
auto start = std::chrono::system_clock::now();
setlocale(LC_ALL, "russian");
std::list<char> a = { 'Р', 'У', 'Д', 'Е', 'Н', 'С', 'К', 'И', 'Й' };
std::list<char> b = { 'Ч', 'Е', 'Т', 'В', 'Е', 'Р', 'Т', 'А', 'К' };
std::list<char> c = { 'К', 'И', 'Р', 'Е', 'Й', 'К', 'О', 'В', 'А' };
std::list<char> d = { 'К', 'О', 'Т', 'О', 'В' };
std::list<char> bcIntersect;
findIntersection(b, c, bcIntersect);
printList(bcIntersect);
std::list<char> abcUnion;
findUnion(a, bcIntersect, abcUnion);
printList(abcUnion);
std::list<char> abcdDiff;
findDifference(abcUnion, d, abcdDiff);
printList(abcdDiff);
auto end = std::chrono::system_clock::now();
auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
std::cout << elapsed.count() << '\n';
return 0;
}
3. Реализация с массивами байт
#include <bitset>
#include <iostream>
#include <locale>
#include <chrono>
const int ALPHABET_SIZE = 32; // Алфавит (без буквы "ё")
// Функция для перевода символов в битовое представление
std::bitset<ALPHABET_SIZE> stringToBitset(const std::string& word) {
std::bitset<ALPHABET_SIZE> bits;
for (char c : word) {
if (c >= 'А' && c <= 'Я') {
bits.set(c - 'А'); // Помещаем буквы в нужный бит
}
}
return bits;
}
// Функция для нахождения пересечения двух множеств
std::bitset<ALPHABET_SIZE> findIntersection(const std::bitset<ALPHABET_SIZE>& set1, const std::bitset<ALPHABET_SIZE>& set2) {
return set1 & set2;
}
// Функция для нахождения объединения двух множеств
std::bitset<ALPHABET_SIZE> findUnion(const std::bitset<ALPHABET_SIZE>& set1, const std::bitset<ALPHABET_SIZE>& set2) {
return set1 | set2;
}
// Функция для нахождения разности двух множеств
std::bitset<ALPHABET_SIZE> findDifference(const std::bitset<ALPHABET_SIZE>& set1, const std::bitset<ALPHABET_SIZE>& set2) {
return set1 & ~set2;
}
// Функция для печати множества
void printBitset(const std::bitset<ALPHABET_SIZE>& bits) {
for (int i = 0; i < ALPHABET_SIZE; ++i) {
if (bits[i]) {
std::cout << static_cast<char>('А' + i);
}
}
std::cout << std::endl;
}
int main() {
auto start = std::chrono::system_clock::now();
setlocale(LC_ALL, "russian");
std::string a = "РУДЕНСКИЙ";
std::string b = "ЧЕТВЕРТАК";
std::string c = "КИРЕЙКОВА";
std::string d = "КОТОВ";
std::bitset<ALPHABET_SIZE> bitA = stringToBitset(a);
std::bitset<ALPHABET_SIZE> bitB = stringToBitset(b);
std::bitset<ALPHABET_SIZE> bitC = stringToBitset(c);
std::bitset<ALPHABET_SIZE> bitD = stringToBitset(d);
std::bitset<ALPHABET_SIZE> bcIntersect = findIntersection(bitB, bitC);
printBitset(bcIntersect);
std::bitset<ALPHABET_SIZE> abcUnion = findUnion(bitA, bcIntersect);
printBitset(abcUnion);
std::bitset<ALPHABET_SIZE> abcdDiff = findDifference(abcUnion, bitD);
printBitset(abcdDiff);
auto end = std::chrono::system_clock::now();
auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
std::cout << elapsed.count() << '\n';
return 0;
}
4. Реализация с машинными словами
#include <iostream>
#include <locale>
#include <chrono>
typedef uint32_t Set; // 32-битное слово для 32 букв алфавита
const int ALPHABET_SIZE = 32; // 32 буквы
// Функция для перевода слова в машинное слово
Set stringToSet(const std::string& word) {
Set set = 0;
for (char c : word) {
if (c >= 'А' && c <= 'Я') {
set |= (1 << (c - 'А')); // Устанавливаем бит для буквы
}
}
return set;
}
// Функция для нахождения пересечения двух множеств
Set findIntersection(Set set1, Set set2) {
return set1 & set2;
}
// Функция для нахождения объединения двух множеств
Set findUnion(Set set1, Set set2) {
return set1 | set2;
}
// Функция для нахождения разности двух множеств
Set findDifference(Set set1, Set set2) {
return set1 & ~set2;
}
// Функция для печати множества
void printSet(Set set) {
for (int i = 0; i < ALPHABET_SIZE; ++i) {
if (set & (1 << i)) {
std::cout << static_cast<char>('А' + i);
}
}
std::cout << std::endl;
}
int main() {
auto start = std::chrono::system_clock::now();
setlocale(LC_ALL, "russian");
std::string a = "РУДЕНСКИЙ";
std::string b = "ЧЕТВЕРТАК";
std::string c = "КИРЕЙКОВА";
std::string d = "КОТОВ";
Set setA = stringToSet(a);
Set setB = stringToSet(b);
Set setC = stringToSet(c);
Set setD = stringToSet(d);
Set bcIntersect = findIntersection(setB, setC);
printSet(bcIntersect);
Set abcUnion = findUnion(setA, bcIntersect);
printSet(abcUnion);
Set abcdDiff = findDifference(abcUnion, setD);
printSet(abcdDiff);
auto end = std::chrono::system_clock::now();
auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
std::cout << elapsed.count() << '\n';
return 0;
}
