最近,我遇到了需要计算给定间隔之外的元素的需求。
例如,如果我有一个排序的 vector {10,20,30}和另一个排序的 vector {15,25},它们的边界定义了间隔。我想计算“10”和“30”(范围内只有20)。为此,我使用std::vector和std::lower_bound,一次向前扫描 vector ,一次反向扫描。
代码如下:
int t[] = { 15, 25 };
int c[] = { 10, 20, 30 };
std::vector<int> tt(t, t + 2);
std::vector<int> cc(c, c + 3);
auto lower = std::lower_bound(cc.begin(), cc.end(), tt.front(), [](int a, int b){ return a < b; });
auto upper = std::lower_bound(cc.rbegin(), cc.rend(), tt.back(), [](int a, int b){ return a > b; });
size_t beforeCount = lower - cc.begin();
size_t afterCount = upper - cc.rbegin();
我希望“下”和“上”都指向同一个元素:20。
我花了一些时间,有人在这里看到问题吗?
我真的很想为此使用STL。
谢谢,
亚历克斯
最佳答案
我认为您对迭代器的区别和迭代器指向的值感到困惑。
您的程序完全按照您的想法运行,请查看here。beforeCount
和afterCount
都等于1。它们是迭代器,而不是任何vector元素的值,它们只是指向 vector 中值的指针。
要打印相应的元素,只需执行以下操作:
std::cout << cc[beforeCount] << std::endl;
std::cout << cc[afterCount] << std::endl;
输出:
20
20
注意:
您可以在不使用中间数组的情况下初始化 vector :
std::vector<int> tt { 15, 25 };
std::vector<int> cc { 10, 20, 30 } ;
关于c++ - 具有反向迭代器的std::vector上的std::lower_bound产生错误的结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24228712/