你好,我是问刚才那个istream_iterator问题的人,我把程序给你看。

#include<vector>
#include<iostream>
#include<string>
#include<algorithm>
#include<fstream>
#include<iterator>
using namespace std;
class GreaterThan
{
public:
GreaterThan(int sz=6):_size(sz){}
int size(){return _size;}
bool operator()(const string &s1){return s1.size()>_size;}
private:
unsigned int _size;
};
class PrintElem
{
public:
PrintElem(int lineLen=8):_line_length(lineLen),_cnt(0){}
void operator()(const string &elem)
{
++_cnt;
if(_cnt % _line_length==0)
cout<<'\n';
cout<<elem<<" ";
}
private:
int _line_length;
int _cnt;
};
class LessThan
{
public:
bool operator()(const string& s1,const string& s2){return s1.size()<s2.size();}
};
typedef vector<string> textwords;
void process_vocab(vector<textwords> *pves)
{
if(!pves)
return;

vector<string> texts;
vector<textwords>::iterator iter;
for(iter=pves->begin();iter!=pves->end();iter++)
{
copy((*iter).begin(),(*iter).end(),back_inserter(texts));
}

sort(texts.begin(),texts.end());
for_each(texts.begin(),texts.end(),PrintElem());
cout<<"\n\n";

vector<string>::iterator it;
it=unique(texts.begin(),texts.end());
texts.erase(it,texts.end());
for_each(texts.begin(),texts.end(),PrintElem());
cout<<"\n\n";

stable_sort(texts.begin(),texts.end(),LessThan());
for_each(texts.begin(),texts.end(),PrintElem());
cout<<"\n\n";

int cnt=0;
count_if(texts.begin(),texts.end(),GreaterThan());//计数
cout<<"numbers greater than six "<<cnt<<endl;
static string rw[]={"the","but","and","or","if"};
vector<string> remove_words(rw,rw+5);
vector<string>::iterator its=remove_words.begin();
for(;its!=remove_words.end();its++)
{
count(texts.begin(),texts.end(),*its);
cout<<cnt<<" "<<*its<<endl;
texts.erase(remove(texts.begin(),texts.end(),*its),texts.end());
}
for_each(texts.begin(),texts.end(),PrintElem());
cout<<"\n\n";
}
#include<string>
void mian()
{
vector<textwords> sample;
vector<string> t1;
vector<string> t2;
string t1fn,t2fn;
cout<<"text1";
cin>>t1fn;
cout<<"text2";
cin>>t2fn;
ifstream infile1(t1fn.c_str());
ifstream infile2(t2fn.c_str());
istream_iterator<string > input_set1 (infile1), eos;
istream_iterator<string > input_set2 (infile2);
copy(input_set1,eos,back_inserter(t1));
copy(input_set2,eos,back_inserter(t2));
sample.push_back(t1);
sample.push_back(t2);
process_vocab(&sample);
system("pause");
}

第1个回答  2012-07-22
你的代码,在我这里能够编译成功,只是稍微地改一下void mian为int main(),把不可移植的system("pause")删了。你说的二元 == 操作符的错,我这里没有,编译通过了。

我一直认为是copy使用的不当,主要是因为copy有使用==与!=符。我的库实现中copy是用!=符的,所以,我现在也用==符试一试,自己写的(模仿VC繁琐突兀的风格):

namespace vc {
template <typename InputIterator, typename OutputIterator>
OutputIterator copy (InputIterator first,
InputIterator last, OutputIterator to)
{
while (true) {
if (first == last)
{
break;
}
else
{
*to = *first;
++to;
++first;
}
}
return to;
}
}

我一直认为VC会把复制模板写成这样。把你所有用std::copy的地方都改为vc::copy,却还是能编译成功。我也不知道为什么了。
template<class In, class Out> Out copy (In first, In last, Out res)
{
while (first != last) *res++ = *first++;
return res;
}
这个是C++之父写的copy,你用一下这个,看看能不能编译通过吧。来自:求助得到的回答本回答被提问者和网友采纳
第1个回答  2012-07-22
太深奥了。。。学习一下。
第2个回答  2012-07-21
#include<vector> #include<iostream> #include<string> #include<algorithm> #include<fstream> #include<iterator> using namespace std; class GreaterThan { public: GreaterThan(int sz=6):_size(sz){} int size(){return ...