Поиск части вектора в векторе
Для std::string есть команда rfind, а есть ли что-то для векторов?
Мне нужно найти подвектор в векторе справа налево, как это можно реализовать?
Ответы (1 шт):
Автор решения: Vladimir Afanasyev
→ Ссылка
Например так
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
vector<string> v1 = {"A","B","C"};
vector<string> v3 = {"A","C","C"};
vector<string> v2 = {"X","Y","A","B","C","D"};
auto res = search(begin(v2), end(v2), begin(v1), end(v1));
auto found = res != end(v2);
cout << boolalpha << found;
auto res2 = search(begin(v2), end(v2), begin(v3), end(v3));
auto found2 = res2 != end(v2);
cout << boolalpha << found2;
return 0;
}
Справа - налево: переворачиваем список, в котором ищем.
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
vector<string> v1 = { "A","B","C" };
vector<string> v2 = { "X","Y","M","C","B","A" };
reverse(begin(v2), end(v2));
auto res = search(begin(v2), end(v2), begin(v1), end(v1));
auto found = res != end(v2);
cout << boolalpha << found << endl;
return 0;
}
upd:
Если вам нужно искать вхождение с конца, то можно просто перевернуть оба вектора, найти вхождение и получить позицию в исходном векторе.
Пример:
- Исходный вектор
a=A, B, C, D, A, B. Ищем -b=A, B - Переворачиваем вектора.
a=B, A, D, C, B, A. Ищемb=B, A - Ищем вхождение
bвa- позиции0и4 - Определяем перевод позиции перевернутого вектора в позицию не в перевернутом векторе по формуле
pos(T) = len(T) - pos(R) - len(S), гдеpos(T)- позиция в искомом векторе,len(T)- длинна этого же вектора,pos(R)- позиция в перевернутом векторе,len(S)- длинна искомого вектора. 0->4,4->0