Почему std :: set_intersection не работает? - PullRequest
0 голосов
/ 06 мая 2020

У меня есть следующий код:

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

int main() {
// your code goes here
int t;
cin>>t;
while(t--)
{
    string a;
    string b;
    cin>>a;
    cin>>b;
    vector<char> v1(a.begin(),a.end());
    vector<char> v2(b.begin(),b.end());

    sort(v1.begin(),v1.end());
    sort(v2.begin(),v2.end());
    vector<char> c;
    auto ls = set_intersection(v1.begin(),v1.end(),v2.begin(),v2.end(),c.begin());
    cout<<"hello"<<endl;
    cout<<ls-c.begin()<<endl;
    cout<<c.size()<<endl;

}
return 0;
}

Ничего не печатается после строки set_intersection, даже "привет", не имеющего отношения к линии пересечения, почему ??

1 Ответ

5 голосов
/ 06 мая 2020

Это не работает, потому что c это пусто . Это означает, что c.begin() будет равно c.end(), а разыменование конечного итератора приводит к undefined поведению .

Вам необходимо вставить элементы в вектор, например, используя std::back_inserter:

auto ls = set_intersection(v1.begin(),v1.end(),v2.begin(),v2.end(),back_inserter(c));

Однако с этим есть одна проблема: итератор, который возвращает set_intersection, является концом итератора back_inserter, который вы передали в set_intersection функция. Этот итератор не имеет отношения к c.begin(), что означает, что вы действительно не можете сделать ls - c.begin().

К сожалению, на самом деле нет способа определить расстояние между начальным back_inserter(c) итератором и ls.

...