STL迭代器相关的输出迭代器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STL迭代器相关的输出迭代器相关的知识,希望对你有一定的参考价值。

我的基类定义是这样的

template< class T >
class Matrix_B


protected:

string FileInp;

string FileOut;

unsigned int RowSize,
ColSize;

vector< vector< T > > pMatrix;

public:
Matrix_B( unsigned int nrow = 2,
unsigned int ncol = 2,
string FileInp = "matrix.in",
string FileOut = "matrix.out" );

void ReadMatrix( void );

void PrintMatrix( char *pHeader = "" );
;
下面是我之前的PrintMatrix函数
template < class T >
void Matrix_B< T >::PrintMatrix ( char *pHeader )

...
fout << pHeader << endl;
for( unsigned int i = 0 ; i < RowSize ; i++ )
for( unsigned int j = 0 ; j < ColSize ; j++ )

if( j % ColSize == 0 )
fout << endl;
fout << pMatrix[ i ][ j ] << " ";

...

我之前的PrintMatrix函数是可以正常的运行的,但是我们老师要求我们用迭代器iterator 完成输出,不知道应该怎么弄,因为输出矩阵不比输出一维数组,输出时要考虑换行,当if( j % ColSize == 0 )要换行,我如果用流迭代器怎么弄?用copy?但是换行是一个难点,希望高手解答下!
一楼似乎没有看明白我的问题,我是要把矩阵写入fout 文件指针所指的文件中,要使用迭代器,但是由于是矩阵,要考虑在相应位置换行,所以不知道应该如何实现.

参考技术A #include<fstream>
#include<iostream>
#include<iterator>
#include<string>
#include<algorithm>
#include<vector>
#include<map>
using namespace std;
int main()

istream_iterator<string> ii(cin);
istream_iterator<string> eos;
vector<string>v(ii,eos);
typedef vector<string>::reverse_iterator MI;
typedef vector<string>::iterator KI;
MI ri=find(v.rbegin(),v.rend(),"guo");
KI i=ri.base();
//返回ri后一个元素的迭代器,因此如果想取得查到的元素的迭代器的话,用i-1就可以得到。
//本code为了看效果,正好输出其后的元素。
cout<<(*i)<<endl;
KI li=find(v.begin(),v.end(),"guo");
cout<<(*(--li))<<endl;
// 输出其前一个元素

//输入 li guo guo qiang EOF(Ctrl+Z)
//输出 qiang li
参考技术B template < class T >
void Matrix_B< T >::PrintMatrix ( char *pHeader )

...
fout << pHeader << endl;
vector<vector<T>>::iterator it= pMatrix.begin();
while(it != pMatrix.end())

vector<T>::iterator itSec= it->begin();
while(itSec != it->end())

fout<<*itSec<<" ";
++itSec;

fout<<endl;
++it;

getchar();

STL 笔记 迭代器 iterator

stl 中迭代器能够理解为面向对象版本号的广义指针,提供了对容器中的对象的訪问方法,能够遍历容器全部元素。也能够訪问随意元素。stl 迭代器有下面五种:
  • Input iterators   仅仅读,输入迭代器,支持如:istream
  • Output iterators  仅仅写,输出迭代器。支持如:ostream、inserter
  • Forward iterators 读写,前向迭代器。仅仅能前向移动
  • Bidirectional iterators 读写,双向迭代器,可以双向移动。支持如: list、set、map
  • Random access iterators 读写,随机迭代器,可以随机訪问,支持如:vector、deque、string

从功能上看,输入和输出迭代器并列,然后前向迭代器、双向迭代器和随机迭代器之间的关系就类似于类的继承关系。比方。能够将随机訪问迭代器作为双向迭代器或前向迭代器来使用。

举例:

stl 中的 find 函数须要输入迭代器:

template <class _InputIter, class _Tp>
inline _InputIter find(_InputIter __first, _InputIter __last,
                       const _Tp& __val,
                       input_iterator_tag)
{
  while (__first != __last && !(*__first == __val))
    ++__first;
  return __first;
}

stl 中 的 generate_n 函数须要输出迭代器:

/* The generate_n algorithm traverses the range [first, first + n)
   assigning to each element the value returned by gen. Note that generate
   modifies  the elements in the specified range.  */
template <class _OutputIter, class _Size, class _Generator>
_OutputIter generate_n(_OutputIter __first, _Size __n, _Generator __gen) {
  __STL_REQUIRES(_OutputIter, _OutputIterator);
  for ( ; __n > 0; --__n, ++__first)
    *__first = __gen();
  return __first;
}

stl 中 replace 函数要求前向迭代器:

template <class _ForwardIter, class _Tp>
void replace(_ForwardIter __first, _ForwardIter __last,
             const _Tp& __old_value, const _Tp& __new_value) {
  __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator);
  __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool,
         typename iterator_traits<_ForwardIter>::value_type, _Tp);
  __STL_CONVERTIBLE(_Tp, typename iterator_traits<_ForwardIter>::value_type);
  for ( ; __first != __last; ++__first)
    if (*__first == __old_value)
      *__first = __new_value;
}

stl 中的 reverse 函数要求双向迭代器:

template <class _BidirectionalIter>
inline void reverse(_BidirectionalIter __first, _BidirectionalIter __last) {
  __STL_REQUIRES(_BidirectionalIter, _Mutable_BidirectionalIterator);
  __reverse(__first, __last, __ITERATOR_CATEGORY(__first));
}

stl 中的 sort 函数要求随机訪问迭代器:

template <class _RandomAccessIter>
inline void sort(_RandomAccessIter __first, _RandomAccessIter __last) {
  __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
  __STL_REQUIRES(typename iterator_traits<_RandomAccessIter>::value_type,
                 _LessThanComparable);
  if (__first != __last) {
    __introsort_loop(__first, __last,
                     __VALUE_TYPE(__first),
                     __lg(__last - __first) * 2);
    __final_insertion_sort(__first, __last);
  }
}

【原文:http://blog.csdn.net/thisinnocence/article/details/39909787】


以上是关于STL迭代器相关的输出迭代器的主要内容,如果未能解决你的问题,请参考以下文章

STL源码分析--iterator

STL

STL 笔记 迭代器 iterator

STL源码分析之迭代器

STL 2—迭代器相关运算——advance(),distance(),next(),prev()

STL之迭代器(iterator)