c++STL里lower_bound函数在以pair为单位的vector容器里的用法

在用这个功能之前,猜测lower_bound()是返回第一个同时大于等于pair两个值元素的地址,在百度找了一圈发现找不到相关的说明,又懒得自己敲代码验证,于是在谷歌上找到了相关的描述并证明了猜想。

于是便可以用这个方法来很方便的解决一些问题,比如找到一串数字里出现第k次的数字x,代码如下。

#include <bits/stdc++.h>
using namespace std;
vector <pair<int, int > > a;
int main()
{
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++)
	{
		int b;
		cin >> b;
		a.emplace_back(b, i);
	}
	sort(a.begin(), a.end());
	int x, k;
	cin >> x >> k;
	auto it = lower_bound(a.begin(), a.end(), make_pair(x, 0));
	if (it - a.begin() < 0)
	{
		cout << -1;
		return 0;
	}
	it += k - 1;
	if (it->first == x)
	{
		cout << it->second;
	}
	else
	{
		cout << -1;
	}
}

另外,pair的vector默认排序便是first优先从小到大,first相同再排second。

set的lower_bound函数是按照从小到大的顺序返回大于或等于给定值的第一个元素的迭代器。如果你想要逆序,可以使用set的reverse_iterator来遍历集合并输出元素。你可以参考下面的代码示例: ```cpp #include <iostream> #include <set> int main() { std::set<int> myset = {21, 64, 17, 78, 49}; std::set<int>::reverse_iterator rit; std::cout << "myset contains: "; for (rit = myset.rbegin(); rit != myset.rend(); ++rit) { std::cout << *rit << ' '; } std::cout << '\n'; return 0; } ``` 这段代码首先创建了一个set并初始化了一些元素。然后使用reverse_iterator来逆序遍历set并输出元素。输出结果为:78 64 49 21 17。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [c++ set 的常见操作](https://blog.csdn.net/qq_45752450/article/details/107459429)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [杂记1:正向反向迭代器,不同stl容器lower_bound的使用(set,map,vector,arr,pair),数字转字符串](https://blog.csdn.net/weixin_50816938/article/details/123942734)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Arodex

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值