gpt4 book ai didi

c++ - 使用 'lower_bound'

转载 作者:行者123 更新时间:2023-11-28 06:11:58 28 4
gpt4 key购买 nike

#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.

你必须在这里决定一个类型。你有int吗的或long的?

您调用 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++ 中使用如此短的变量名称,使用更长的描述性名称。

关于c++ - 使用 'lower_bound',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31084591/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com