当前位置: 首页 > 工具软件 > Advance > 使用案例 >

C++:浅析iterator头文件中的advance()、next()、prev()函数

曾修真
2023-12-01

advance()的简单解释及用法

advance()的函数原型

template< class InputIt, class Distance >void advance( InputIt& it, Distance n );

template< class InputIt, class Distance >constexpr void advance( InputIt& it, Distance n );

advance()的含义:
表示将输入迭代器it移动n个单位的步长,其中n可为正数与负数。注意:这里的输入迭代器为双向迭代器,即迭代器即可右移,也可左移。
若移动n个单位的步长后,超出迭代器范围[begin,end),则此行为未定义。

advance()函数返回值:
函数返回值为void,也就是将传入的迭代器用引用的方式移动n个单位了。

测试代码:

 vector<int> vc{ 1,2,3,4,5,6,7 };
 vector<int>::iterator beg = vc.begin();
 cout << "beg指向的元素值为:" << *beg << endl;//1
 advance(beg, 2);
 cout << "将beg右移两个单位后指向的元素值为:" << *beg << endl;//3
 advance(beg, -1);
 cout << "将beg左移一个单位后指向的元素值为:" << *beg << endl;//2
 

测试结果:

beg指向的元素值为:1
将beg右移两个单位后指向的元素值为:3
将beg左移一个单位后指向的元素值为:2

next()的简单解释及用法

next()的函数原型:

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

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

next()的函数实现:

template<class ForwardIt>
ForwardIt next(ForwardIt it,
               typename std::iterator_traits<ForwardIt>::difference_type n = 1)
{
    std::advance(it, n);
    return it;
}

next()的含义:
表示迭代器右移n个单位的步长,即迭代器+n。
若移动n个单位的步长后,超出迭代器范围[begin,end),则此行为未定义。

next()函数返回值:
函数的返回值为一个迭代器,也就是传入迭代器右移n个单位后,返回这个移动后的新迭代器。

测试代码:

 vector<int> vc{ 1,2,3,4,5,6,7 };
 vector<int>::iterator beg = vc.begin();
 for (int i = 0; i < vc.size(); ++i)
 {
  auto it = next(beg, i);
  cout << "beg右移" << i << "个单位后的元素值为:" << *it << endl;
 }

测试结果如下:

beg右移0个单位后的元素值为:1
beg右移1个单位后的元素值为:2
beg右移2个单位后的元素值为:3
beg右移3个单位后的元素值为:4
beg右移4个单位后的元素值为:5
beg右移5个单位后的元素值为:6
beg右移6个单位后的元素值为:7

prev()的简单解释及用法

prev()的函数原型:

template< class BidirIt >BidirIt prev(
  BidirIt it, 
  typename std::iterator_traits<BidirIt>::difference_type n = 1 );

template< class BidirIt >constexpr BidirIt prev(
  BidirIt it, 
  typename std::iterator_traits<BidirIt>::difference_type n = 1 );

prev()的函数实现:

template<class BidirIt>
BidirIt prev(BidirIt it, typename std::iterator_traits<BidirIt>::difference_type n = 1)
{
    std::advance(it, -n);
    return it;
}

prev()的含义:
表示迭代器左移n个单位,即迭代器-n。
若移动n个单位的步长后,超出迭代器范围[begin,end),则此行为未定义。

prev()函数返回值:
函数的返回值为一个迭代器,也就是传入迭代器左移n个单位后,返回这个移动后的新迭代器。

测试代码:

 vector<int> vc{ 1,2,3,4,5,6,7 };
 vector<int>::iterator end = vc.end();
 for (int i = 1; i <= vc.size(); ++i)
 {
  auto it = prev(end, i);
  cout << "end左移" << i << "个单位后的元素值为:" << *it << endl;
 } 
 

测试结果:

end左移1个单位后的元素值为:7
end左移2个单位后的元素值为:6
end左移3个单位后的元素值为:5
end左移4个单位后的元素值为:4
end左移5个单位后的元素值为:3
end左移6个单位后的元素值为:2
end左移7个单位后的元素值为:1
 类似资料: