【问题标题】:Why is std::set_intersection not working?为什么 std::set_intersection 不起作用?
【发布时间】:2020-05-06 16:00:10
【问题描述】:

我有以下代码:

#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”也不打印,为什么??

【问题讨论】:

  • typedef long long ll; - 为什么?您是否试图故意为未来的读者混淆您的代码?
  • 这是一个有竞争力的编程代码,我已经阅读了很多文章来使用它来减少编码时间。这样做可以吗?
  • @VamsiMohan 好吧,没有什么能阻止你这样做,它可以节省几秒钟的打字时间。但请记住,在实际的实际编程中,这些被认为是不好的做法。如果你正在做有竞争力的编程来学习常规编程,我会避免那些。

标签: c++ stl set-intersection


【解决方案1】:

它不起作用,因为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 将返回的迭代器是您传递给 set_intersection 函数的 back_inserter 迭代器的结尾。该迭代器与c.begin() 无关,这意味着您不能真正做到ls - c.begin()

不幸的是,真的没有办法得到初始 back_inserter(c) 迭代器和 ls 之间的距离。

【讨论】:

  • 我们不能调用 c.size() 来获取它的长度吗?如果我错了,请原谅我,我对 C++ 很陌生
  • @VamsiMohan 当然可以。您不能使用迭代器距离,但 c.size() 可以正常工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-08
  • 1970-01-01
  • 2015-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多