繁体   English   中英

使用“ lower_bound”

[英]Using 'lower_bound'

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

int main() {
int t;
cin >> t;
for (int i = 0; i < t; ++i) {
    int n, m;
    cin >> n >> m;
    long int ar[n];
    for (int j = 0; j < n; ++j) cin >> ar[j];
    vector<long> v(ar, ar+n);
    sort(v.begin(), v.end());
    for (int k = 0; k < m; ++k) {
        long b;
        cin >> b;
        if (binary_search(v.begin(), v.end(), b)) cout << "YES" << endl;
        else {
            vector<int>::iterator it;
            it=lower_bound(v.begin(), v.end(), b);
            v.insert(it-v.begin(), b);
            cout << "NO" << endl;
        }
    }
}
return 0;
}

编译器在'it = lower_bound(______)'和'(it-v.begin(),b)'处显示错误。 我听不懂 请帮助我解决这个问题。

[Error] no match for 'operator=' (operand types are 'std::vector<int>::iterator {aka __gnu_cxx::__normal_iterator<int*, std::vector<int> >}' and '__gnu_cxx::__normal_iterator<long int*, std::vector<long int> >')

[Error] no match for 'operator-' (operand types are 'std::vector<int>::iterator {aka __gnu_cxx::__normal_iterator<int*, std::vector<int> >}' and 'std::vector<long int>::iterator {aka __gnu_cxx::__normal_iterator<long int*, std::vector<long int> >}')

通过错误消息,可以更轻松地找到错误。

[Error] no match for 'operator=' (operand types are 'std::vector<int>::iterator {aka __gnu_cxx::__normal_iterator<int*, std::vector<int> >}' and '__gnu_cxx::__normal_iterator<long int*, std::vector<long int> >')

您的类型不匹配。 一个迭代器进入vector<int> ,另一个进入vector<long> 看到:

vector<long> v(ar, ar+n); // the vector you declare.

vector<int>::iterator it; // the iterator you want to save the element location in.

您必须在这里决定一种类型。 您有intlong的吗?

您的insert请求也有误。 第一个参数不应像您似乎想的那样是索引,它应该是您要插入它的位置的迭代器。 所以就这样称呼它:

v.insert(it, b); // we don't have to subtract `v.begin()`.

睡一会儿再看一遍,这里还有一些其他评论。

cin >> n >> m;
long int ar[n];

在这里,您可以从输入中读取数组的大小。 这是一个编译器扩展,不是标准的C ++。 在C ++中,在编译时必须知道数组的大小。 使用std::vector代替。 您已经使用它了。

long int ar[n];
for (int j = 0; j < n; ++j) cin >> ar[j];
vector<long> v(ar, ar+n);

无论如何,当您使用std::vector ,就不需要该数组。 特别是因为它利用了我上面所说的编译器扩展。 更改为

vector<long> v(n);
for (int j = 0; j < n; ++j) cin >> v[j];

最后但并非最不重要的一点是使用更好的变量名。 您所有的变量均为1或2个字符长。 这使得即使遵循相对较少的行数也很难遵循代码,并且一旦代码变大,就变得绝对可怕。 没有理由在C ++中使用这样的简短变量名,而使用更长的描述性变量名。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM