首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

iostream迭代器的ostream有关问题

2013-09-06 
iostream迭代器的ostream问题#includeiostream#includefstream#includevector#includealgorithm#i

iostream迭代器的ostream问题


#include<iostream>
#include<fstream>
#include<vector>
#include<algorithm>
#include<iterator>
#include<string>
using  namespace std;


template<class T,class baseType>
void Show(T &v,baseType r)
{
myostream_iterator<baseType> out(cout," ");
copy(v.begin(),v.end(),out);
cout<<endl;
}


/*ostream& operator << (ostream& os,const vector<string>&vec)
{
   vector<string>::const_iterator iter = vec.begin();
while (iter != vec.end())
{
os<<*iter++<<" 0 ";
}
os<<endl;
return os;
}*/

template<class InputIterator, class OutputIterator>
OutputIterator mycopy (InputIterator first, InputIterator last, OutputIterator result)
{
   while (first != last) *result++ = *first++;
   return result;
}

template<class T>
void Show(T &v)
{
Show(v,v[0]);
}




int main()
{
vector<string> vec(10,"Bosch");
Show(vec);
Show(vec,string(""));
cout<<vec;
vector<vector<string> > dvec(2,vec);
Show(dvec[0],string(""));
Show(*dvec.begin(),string(""));
ostream_iterator< vector<string> > out(cout," ");
vector<string> tes = vec;
//*out<<*dvec.begin();
copy(dvec.begin(),dvec.end(),out);

cout<<"*******************Success*********************"<<endl;
Show(dvec,vec);



}


这段代码不能正常执行,提示找不到匹配的<<操作符
重载如下:

typedef basic_ostream<char,char_traits<char> >  ostream_Type;
///you can see the ostream_Type as ostream.

ostream_Type& operator << (ostream_Type& os,const vector<string>& vec)
{
vector<string>::const_iterator iter = vec.begin();
while (iter != vec.end())
{
os<<(*iter++)<<" ";
}
os<<endl;
return os;
}

仍然不好使,但是如果自己重写ostream_iterator代理类迭代器就行,如下,求高手指点:

template <class T, class charT=char, class traits=char_traits<charT> >
class myostream_iterator :public iterator<output_iterator_tag, void, void, void, void>


{
  basic_ostream<charT,traits>* out_stream;
  //ostream* out_stream;
  const charT* delim;

public:
  typedef charT char_type;
  typedef traits traits_type;
  typedef basic_ostream<charT,traits> ostream_type;
  //typedef ostream ostream_type;
  myostream_iterator(ostream_type& s) : out_stream(&s), delim(0) {}
  myostream_iterator(ostream_type& s, const charT* delimiter)
    : out_stream(&s), delim(delimiter) { }
  myostream_iterator(const myostream_iterator<T,charT,traits>& x)
    : out_stream(x.out_stream), delim(x.delim) {}
  ~myostream_iterator() {}

  myostream_iterator<T,charT,traits>& operator= (const T& value) {
    *out_stream << value;
    if (delim!=0) *out_stream << delim;
    return *this;
  }
 
  myostream_iterator<T,charT,traits>& operator*() { return *this; }
  myostream_iterator<T,charT,traits>& operator++() { return *this; }
  myostream_iterator<T,charT,traits>& operator++(int) { return *this; }
}; 


[解决办法]
是要输出vector对象吗?
下面的代码就行:
#include<iostream>
#include<vector>
#include<string>

using namespace std;

ostream& operator<<(ostream &os, std::vector<std::string> &vec)
{
for (int i = 0; i < vec.size(); ++i)
cout << vec[i] << " ";
return os;
}

int main()
{
std::vector<std::string> vec;
std::string str1 = "aaa";
std::string str2 = "bbb";
vec.push_back(str2);
vec.push_back(str1);


cout << vec << endl;
system("pause");
}


不知道理解对不对?
[解决办法]
这是是c++名字查找规则引起的。要想找到自定义的operator<<(xxx, vector<xxx>)函数,有以下几种办法:
① 将该函数的定义放在namespace std中(一般名字查找规则);
② 像版主那样,在与该函数相同的命名空间内定义自己的ostream_iterator。(将标准库的相应版本拷贝出来改个类名即可)(一般名字查找规则)
③ 提供vector<xxx>的一个隐式类型转换类vector_wrapper,并未该类提供operator<<(xxx, vector_wrapper)(Koenig名字查找)
参考:
http://bytes.com/topic/c/answers/716006-ostream_iterator-vector-pair-int-string
http://www.cnblogs.com/zhenjing/archive/2010/10/20/1856309.html

热点排行