c++ - 为什么 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
是空的。这意味着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
.