C++/STL Algorithms Iterator/istream iterator
Содержание
- 1 Advance istream_iterator
- 2 Read string from keyboard and save to vector directly
- 3 Read words from standard input, sort and print out without duplicates
- 4 Taking the sum of values from a stream
- 5 Use istream_iterator to loop through a string
- 6 Use istream_iterator to loop through a string defined by char pointer
Advance istream_iterator
/* The following code example is taken from the book
* "The C++ Standard Library - A Tutorial and Reference"
* by Nicolai M. Josuttis, Addison-Wesley, 1999
*
* (C) Copyright Nicolai M. Josuttis 1999.
* Permission to copy, use, modify, sell and distribute this software
* is granted provided this copyright notice appears in all copies.
* This software is provided "as is" without express or implied
* warranty, and with no claim as to its suitability for any purpose.
*/
#include <iostream>
#include <string>
#include <algorithm>
#include <iterator>
using namespace std;
int main()
{
istream_iterator<string> cinPos(cin);
ostream_iterator<string> coutPos(cout," ");
/* while input is not at the end of the file
* - write every third string
*/
while (cinPos != istream_iterator<string>()) {
// ignore the following two strings
advance (cinPos, 2);
// read and write the third string
if (cinPos != istream_iterator<string>()) {
*coutPos++ = *cinPos++;
}
}
cout << endl;
}
/*
Terminate batch job (Y/N)? n
*/
Read string from keyboard and save to vector directly
#include <iostream>
#include <istream>
#include <string>
#include <vector>
#include <algorithm>
#include <functional>
#include <iterator>
using namespace std;
int main( ) {
cout << "Enter a series of strings: ";
istream_iterator<string> start(cin);
istream_iterator<string> end;
vector<string> v(start, end);
vector<string>::iterator p = partition(v.begin( ), v.end( ),bind2nd(less<string>( ), "foo"));
cout << "*p = " << *p << endl;
}
/*
Enter a series of strings: a b c
a s c
de
foo
*p = s
Terminate batch job (Y/N)? n
*/
Read words from standard input, sort and print out without duplicates
/* The following code example is taken from the book
* "The C++ Standard Library - A Tutorial and Reference"
* by Nicolai M. Josuttis, Addison-Wesley, 1999
*
* (C) Copyright Nicolai M. Josuttis 1999.
* Permission to copy, use, modify, sell and distribute this software
* is granted provided this copyright notice appears in all copies.
* This software is provided "as is" without express or implied
* warranty, and with no claim as to its suitability for any purpose.
*/
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <iterator>
using namespace std;
int main()
{
vector<string> coll;
/* read all words from the standard input
* - source: all strings until end-of-file (or error)
* - destination: coll (inserting)
*/
copy (istream_iterator<string>(cin), // start of source
istream_iterator<string>(), // end of source
back_inserter(coll)); // destination
// sort elements
sort (coll.begin(), coll.end());
/* print all elements without duplicates
* - source: coll
* - destination: standard output (with newline between elements)
*/
unique_copy (coll.begin(), coll.end(), // source
ostream_iterator<string>(cout,"\n")); // destination
}
/*
a b c
de
d
s
s
e
w
d
a
b
c^CTerminate batch job (Y/N)? n
*/
Taking the sum of values from a stream
#include <iostream>
#include <iterator>
using std::cout;
using std::endl;
using std::cin;
using std::istream_iterator;
template <typename Iter>
double mySum (Iter begin, Iter end) {
double sum = 0.0;
for( ; begin != end ;)
sum += *begin++;
return sum;
}
int main() {
cout << "Ctrl-Z to stop" << endl;
double av = mySum(istream_iterator<double>(cin), istream_iterator<double>());
cout << "The sum value is " << av << endl;
return 0;
}
/*
Ctrl-Z to stop
^Z
The sum value is 0
*/
Use istream_iterator to loop through a string
#include <iostream>
#include <iterator>
#include <string>
#include <sstream>
using std::cout;
using std::endl;
using std::istream_iterator;
using std::istringstream;
using std::string;
template <typename Iter>
double mySum(Iter begin, Iter end) {
double sum = 0.0;
for( ; begin != end ;)
sum += *begin++;
return sum;
}
int main() {
std::string stock_ticker = "4.5 6.75 8.25 7.5 5.75";
istringstream ticker(stock_ticker);
istream_iterator<double> begin(ticker);
istream_iterator<double> end;
cout << stock_ticker << endl ;
cout << mySum (begin, end) << endl;
return 0;
}
/*
4.5 6.75 8.25 7.5 5.75
32.75
*/
Use istream_iterator to loop through a string defined by char pointer
#include <iostream>
#include <iterator>
#include <string>
#include <sstream>
using std::cout;
using std::endl;
using std::istream_iterator;
using std::istringstream;
using std::string;
template <typename Iter>
double mySum(Iter begin, Iter end) {
double sum = 0.0;
for( ; begin != end ;)
sum += *begin++;
return sum;
}
int main() {
char* stock_ticker = "4.5 6.75 8.25 7.5 5.75";
istringstream ticker(stock_ticker);
istream_iterator<double> begin(ticker);
istream_iterator<double> end;
cout << stock_ticker << endl ;
cout << mySum (begin, end) << endl;
return 0;
}
/*
4.5 6.75 8.25 7.5 5.75
32.75
*/