首页 > 解决方案 > 为什么 std::set_intersection 不起作用?

问题描述

我有以下代码:

#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 线之后什么都没有打印,甚至没有与相交线无关的“hello”,为什么?

标签: c++stlset-intersection

解决方案


它不起作用,因为它c的。这意味着c.begin()等于c.end()和取消引用结束迭代器会导致未定义的行为

您需要在向量中插入元素,例如使用std::back_inserter

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

但是有一个问题:set_intersection将返回的迭代器是back_inserter您传递给set_intersection函数的迭代器的结尾。该迭代器与 which 无关,c.begin()这意味着您不能真正做ls - c.begin().

不幸的是,实际上没有办法获得初始back_inserter(c)迭代器和ls.


推荐阅读