STL中next(),advance(),prev(),next_permutation()函数

5 篇文章 0 订阅
3 篇文章 0 订阅

next()函数

next意为下一个,用来获取一个距离指定迭代器n个元素的迭代器。
next()函数的语法格式如下:

template <class ForwardIterator>
    ForwardIterator next (ForwardIterator it, typename iterator_traits<ForwardIterator>::difference_type n = 1);

it为源迭代器,可以为前向迭代器、双向迭代器和随机迭代器;n为指定新迭代器距离it的距离,默认值为1,。函数会返回一个距离it迭代器n个元素的新迭代器

int main()
{
	vector<int>v{ 1,2,3,4,5,6,7,8,9 };
	vector<int>::iterator it = v.begin();
	auto nit1 = next(it);
	cout << "next(it) is" << " " << *nit1 << endl;//2
	auto nit = next(it, 2);
	cout << "next(it,2) is" <<" "<< *nit << endl;//3

	vector<int>::iterator it1 = v.end();
	auto nit2 = next(it1, -2);
	cout << "next(it1,-2) is" << " " << *nit2 << endl;//8
	return 0;
}

从代码可以看出,当it为前向迭代器时候,n必须为正数,且最终得到的新迭代器为下标为n的位置;当it为反向迭代器时候,n必须为负数,且返回的也是下标为n位置的迭代器。

advacne()函数

advance()函数可以将指定迭代器前移或者后移n个位置,跟next()返回一个新的迭代器不同的是,advance()函数移动的是源迭代器。

int main()
{
	vector<int>v{ 1,2,3,4,5,6,7,8,9 };
	vector<int>::iterator it = v.begin();
	cout << "it 指代的元素为:" << *it << endl;//输出为1
	advance(it, 2);
	cout << "移动之后it指代的元素为" <<" "<< *it << endl;//输出为3
	advance(it, -2);
	cout << "移动之后it指代的元素为" << " " << *it << endl;//输出为1
	advance(it, -3);
	cout << "移动之后it指代的元素为" << " " << *it << endl;//会报错
	return 0;
}

从代码可以看出,advance函数移动的是迭代器本身。

prev()函数

prev是上一个,该函数可以用来获取一个距离指定迭代器n个元素的迭代器。

int main()
{
	vector<int>v{ 1,2,3,4,5,6,7,8,9 };
	vector<int>::iterator it = v.begin();
	auto nit = prev(it, -2);
	cout << "prev(it,-2)指代的元素是"<<" " << *nit << endl;//3

	it = v.end();
	auto nit2 = prev(it, 2);
	cout << "prev(it,2)指代的元素是" << " " << *nit2 << endl;//8
	return 0;
}

因为prev意思是前一个,因此如果n为正数时候,那起始迭代器得是end()开始的,这点和next()函数是相反的.

next_permutation()函数

template<class Iterator>
  bool next_permutation (Iterator first, Iterator last);

template<class Iterator, class Compare>
  bool next_permutation (Iterator first, Iterator last, Compare comp);

C++中STL内置的全排列函数,next_permutation是一个原地算法(会直接改变这个集合,而不是返回一个集合),它对一个可以遍历的集合(如string,vector,list),将迭代器范围 [first, last] 的排列 排列到下一个排列,其中所有排列的集合默认按照operator < 或者 字典序 或者 按照输入到第三个参数 comp 的排列方法排列。如果存在这样的“下一个排列”,返回true并执行排列,否则返回false

int main()
{
	vector<char>ch{ 'a','b','c' };
	do {
		cout << ch[0] << ch[1] << ch[2] << endl;
	} while (next_permutation(ch.begin(), ch.end()));

	return 0;
}

输出结果为:result
f附上一道LeetCode,可以直接调用api实现

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值