- •Int main(){
- •Void unsetf( fmtflags флаги );
- •Int main(){
- •0 False
- •Iostream& manip_name (iostream& stream){
- •If (stream.Rdstate() & ios::eofbit)…
- •Istrea& putback( char ch );
- •Int main()
- •If (!f.Is_open()) return 1;
- •Istream& getline (char* buf, streamsize num);
- •Istream& getline (char* buf, streamsize num, char delim);
- •Int_type peek();
- •Istream& read(char* buf, streamsize num);
- •Istream& seekg( off_type offset, seekdir origin);
- •Istream& seekg( pos_type pos);
- •Istrstream::istrstream( const char* buf);
- •Istrstream::istrstream( const char* buf, streamsize size);
- •Int main(){
- •Int main(){
- •Istrstream si(s);
- •Int count;
- •Void reset(int n)
- •Int main()
- •Int main()
- •Int main(){
- •Int main(){
- •Int main () {
- •V.Push_back ((char*) "zippy");
- •V.Push_back ((char*) "motorboy");
- •Int main () {
Int main () {
vector<const char*> v; // Vector of character strings.
V.Push_back ((char*) "zippy");
V.Push_back ((char*) "motorboy");
print (v);
return 0;
}
3.31
Вспомогательные виды итераторов
Обратный итератор - осуществляет доступ к элементам в обратном порядке, чем итератор произвольного доступа или двунаправленный итератор
Итератор потока - осуществляется доступ к элементам потока, делятся на итераторы потоков ввода и вывода.
Итератор вставки - предназначен для добавления элементов к цепочке объектов
Константный итератор - не допускает изменения данных, на которые он ссылается, формируется путём модификации основного итератора.
Примерр итератора потока:
Int main () {
char buffer [100];
int i = 0;
cout << "Please enter a string: ";
istream_iterator<char, ptrdiff_t> s (cin);
while (*s != '\n') buffer[i++] = *s++;
buffer[i] = '\0'; // Null terminate buffer.
cout << "read " << buffer << endl;
return 0;
}
3.31
Функторы
Функтор-класс, в котором определена операторная функция operator().
Существуют унарные и бинарные функторы. Бинарные функторы получают аргументы в порядке (first,second)
Встроенные функторы определены в <functional> и являются шаблонными классами, что требует типизации при использовании.
Встроенные бинарные функторы
Plus-сумма(first+second);
Minus- разность(first-second);
Multiplies- произведение(first*second);
Divides- частное от деления(first/second);
Modulus-остаток от деления(first/second
Equal-to- true если (first==second)
Not_equal_to-true если (first!=second)
Greater-true если (first>second)
Greater-equal-true если (first>=second)
Less - true если (first<second)
Less_equal - true если (first<=second)
Logical_and - true если ((first&&second)==true)
Logical_or - true если ((first||second)==true)
Встроенные унарные функторы
Logical_not - true если (first==false)
Negate - (-false)
#include <iostream>
#include <conio.h>
#include <functional>
#include <algorithm>
#include <vector>
using namespace std;
template<class T>
void show(vector<T> &v, const char *vn)
{
vector<T>::iterator vi;
cout<<vn<<"=";
for(vi=v.begin(); vi!=v.end(); vi++)
cout<<*vi<<" ";
cout<<endl;
}
int main()
{
vector<double> v1,v2;
for(int i=1;i<10;i++) v1.push_back((double)i);
for(int i=1;i<10;i++) v2.push_back((double)i);
show(v1,"v1"); show(v2,"v2");
transform(v1.begin(), v1.end(), v2.begin(), v2.begin(), multiplies<double>());
show(v1,"v1"); show(v2,"v2");
show(v1,"v1");
transform(v1.begin(),v1.end(),v1.begin(),negate<double>());
show(v1,"v1");
fflush(stdin);
getch();
return 0;
}
Создание функторов
Необходимо создать производный класс от базового класса:
template<class Arg, class Result>
struct unary_functiom
{
typedef Arg argument_type;
typedef Result result_type;
};
template<class Arg1,class Arg2,class Result>
struct binary_function
{
typedef Arg1 first_argument_type;
typedef Arg2 second_argument_type;
typedef Result result_type;
};
Затем в полученном классе требуется перегрузить функцию operator()
#include <iostream>
#include <conio.h>
#include <functional>
#include <algorithm>
#include <vector>
using namespace std;
template<class T>
class myfunctor:binary_function<T,T,T>
{
public:
result_type operator()(first_argument_type f,second_argument_type s)
{
if(f>s) return (result_type)(s/f);
return (result_type)(f/s);
}
};
template<class T>
void show(vector<T> &v, const char *vn)
{
vector<T>::iterator vi;
cout<<vn<<"=";
for(vi=v.begin(); vi!=v.end(); vi++)
cout<<*vi<<" ";
cout<<endl;
}
int main()
{
vector<double> v1,v2;
for(int i=1;i<10;i++) v1.push_back(1.0+rand()%20);
for(int i=1;i<10;i++) v2.push_back(1.0+rand()%20);
show(v1,"v1"); show(v2,"v2");
transform(v1.begin(),v1.end(),v2.begin(),v2.begin(),myfunctor<double>());
show(v1,"v1"); show(v2,"v2");
fflush(stdin);
getch();
return 0;
}
