Я хотел бы пересечь более двух массивов. Вот неполная версия моей кодировки:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
int n;
cin >> n;
cout << "\n";
string rock[n];
for(int i=0;i<n;i++)
{
cin >> rock[i];
cout << "\n";
}
for(int i=0;i<n;i++)
sort(rock[i].begin(), rock[i].end());
}
Так, например, если я ввожу
3
asasadfg
aassdw
dasaasf
Я хочу, чтобы вывод был таким
ads
Нет дублирования и пересечения между более чем 2 массивами. Как лучше всего это сделать? Спасибо
2 ответа
Примечание. Массивы переменной длины не являются стандартными в C++ и в лучшем случае являются функцией, специфичной для компилятора. В этом случае, поскольку длина неизвестна во время компиляции, лучше всего использовать std::vector
.
Теперь нам просто нужно знать, как найти пересечение двух строк и сделать это по всему вектору. Я уверен, что есть более элегантный способ, но, надеюсь, вы сможете проследить, что происходит ниже.
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
int main() {
int n;
std::cin >> n;
std::cout << "\n";
std::vector<std::string> rocks;
for (int i = 0; i < n; ++i) {
std::string temp;
std::cin >> temp;
rocks.push_back(temp);
std::cout << "\n";
}
for (auto &s : rocks) {
std::sort(s.begin(), s.end());
}
std::string diff = rocks[0];
for (int i = 1; i < n; ++i) {
std::string temp_diff;
std::set_intersection(
diff.begin(), diff.end(),
rocks[i].begin(), rocks[i].end(),
std::back_inserter(temp_diff));
diff = temp_diff;
}
auto last = std::unique(diff.begin(), diff.end());
diff.erase(last, diff.end());
std::cout << diff << std::endl;
return 0;
}
diff' to
bool'|", "|27|ошибка: ожидаемое первичное выражение перед "for"|", "|38|ошибка: ISO C++ запрещает объявление `last' без типа |". Как это исправить?
-std=c++17
- Вставьте значения в каждом массиве во временный набор
- Для каждого значения в этом временном наборе, используя это значение в качестве ключа, увеличивайте значение элемента в окончательном наборе.
- Повторяйте 1-2, пока не закончите со всеми входными массивами.
- Общие элементы — это элемент в конечном наборе со значением, равным количеству массивов.
Или даже лучше:
- Вставьте значения в каждом массиве в input_set.
- Перейдите к следующему массиву и, если элемент находится в наборе input_set, сохраните его в наборе output_set.
- Пока есть следующий массив, поменять местами(input_set, output_set), очистить output_set и перейти к шагу 2.
- Повторяющиеся элементы находятся в выходном наборе.
Если элементы отсортированы, пересечение может быть выполнено более эффективно без использования наборов.
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который должен быть) скомпилирован с помощью компилятора C ++. Используйте тег для конкретной версии для вопросов, связанных с конкретной версией стандарта [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] или [C ++ 23] и т. Д. .
std::set_intersection()
для этого