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;
}
输出结果为:
f附上一道LeetCode,可以直接调用api实现。