C++范型程序补充阅读

(1)下面程序通过输入流迭代器来填充vector容器,通过输出流迭代器来写入“流cout”。程序执行时,如果输入为:1 2 3 4 5 q
则输出为:1,2,3,4,5,
1 | 2 | 3 | 4 | 5 |
请填空将程序补充完整。

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
   vector<int> col1;
   istream_iterator<int> intreader(cin),eof;;
   while(intreader!=eof)
   {
      col1.push_back(_______________);          // (1)
      _______________;                        // (2)
   }
   _______________ intwriter(cout,",");   // (3)
   copy(col1.begin(),col1.end(),intwriter);
   cout<<endl;
   copy(col1.begin(),col1.end(),_______________);   // (4)
   cout<<endl;
   return 0;
}

参考解答:
(1)*intreader  (2)++intreader
(3)ostream_iterator (4)ostream_iterator(cout,” | “)
等价程序:

#include<iostream>
#include<vector>
#include<algorithm>
#include<iterator>
using namespace std;
int main()
{
   vector<int> col1(5);
   copy(istream_iterator<int>(cin),istream_iterator<int>(),col1.begin());
   ostream_iterator<int> intwriter(cout,",");
   copy(col1.begin(),col1.end(),intwriter);
   cout<<endl;
   copy(col1.begin(),col1.end(),ostream_iterator<int>(cout,"|"));
   cout<<endl;
   return 0;
}

(2)set用法

#include <algorithm>
#include<set>
#include<iterator>
#include<iostream>
using namespace std;
int main()
{
    set<int>eg1;
//插入
    eg1.insert(1);
    eg1.insert(100);
    eg1.insert(5);
    eg1.insert(1);//元素1因为已经存在所以set中不会再次插入1
    eg1.insert(10);
    eg1.insert(9);
//遍历set,可以发现元素是有序的
    set<int>::iterator set_iter=eg1.begin();
    cout<<"Set named eg1:"<<endl;
    for(; set_iter!=eg1.end(); set_iter++)
        cout<<*set_iter<<" ";
    cout<<endl;
//使用size()函数可以获得当前元素个数
    cout<<"Now there are "<<eg1.size()<<" elements in the set eg1"<<endl;
    if(eg1.find(200)==eg1.end())//find()函数可以查找元素是否存在
        cout<<"200 isn't in the set eg1"<<endl;

    set<int>eg2;
    for(int i=6; i<15; i++)
        eg2.insert(i);
    cout<<"Set named eg2:"<<endl;
    for(set_iter=eg2.begin(); set_iter!=eg2.end(); set_iter++)
        cout<<*set_iter<<" ";
    cout<<endl;
//获得两个set的并
    set<int>eg3;
    cout<<"Union:";
    set_union(eg1.begin(),eg1.end(),eg2.begin(),eg2.end(),
              insert_iterator<set<int> >(eg3,eg3.begin()));//注意第五个参数的形式
    copy(eg3.begin(),eg3.end(),ostream_iterator<int>(cout," "));
    cout<<endl;
//获得两个set的交,注意进行集合操作之前接收结果的set要调用clear()函数清空一下
    eg3.clear();
    set_intersection(eg1.begin(),eg1.end(),eg2.begin(),eg2.end(),insert_iterator<set<int> >(eg3,eg3.begin()));
    cout<<"Intersection:";
    copy(eg3.begin(),eg3.end(),ostream_iterator<int>(cout," "));
    cout<<endl;
//获得两个set的差
    eg3.clear();
    set_difference(eg1.begin(),eg1.end(),eg2.begin(),eg2.end(),insert_iterator<set<int> >(eg3,eg3.begin()));
    cout<<"Difference:";
    copy(eg3.begin(),eg3.end(),ostream_iterator<int>(cout," "));
    cout<<endl;
//获得两个set的对称差,也就是假设两个集合分别为A和B那么对称差为AUB-A∩B
    eg3.clear();
    set_symmetric_difference(eg1.begin(),eg1.end(),eg2.begin(),eg2.end(),insert_iterator<set<int> >(eg3,eg3.begin()));
    copy(eg3.begin(),eg3.end(),ostream_iterator<int>(cout," "));
    cout<<endl;
    return 0;
}

(3)multiset

#include <algorithm>
#include<set>
#include<iterator>
#include<iostream>
using namespace std;
int main()
{
    multiset<int>eg1;
//插入
    eg1.insert(1);
    eg1.insert(100);
    eg1.insert(5);
    eg1.insert(1);//是否插入
    eg1.insert(10);
    eg1.insert(9);
//遍历set,可以发现元素是有序的
    multiset<int>::iterator set_iter=eg1.begin();
    cout<<"Set named eg1:"<<endl;
    for(; set_iter!=eg1.end(); set_iter++)
        cout<<*set_iter<<" ";
    cout<<endl;
//使用size()函数可以获得当前元素个数
    cout<<"Now there are "<<eg1.size()<<" elements in the set eg1"<<endl;
    if(eg1.find(200)==eg1.end())//find()函数可以查找元素是否存在
        cout<<"200 isn't in the set eg1"<<endl;
    return 0;
}

(4)理解map

#include <algorithm>
#include<map>
#include<iterator>
#include<iostream>
#include<cstring>
using namespace std;
struct ltstr
{
    bool operator()(const char* s1, const char* s2) const
    {
        return strcmp(s1, s2) < 0;
    }
};

int main()
{
    map<const char*, int, ltstr> months;

    months["january"] = 31;
    months["february"] = 28;
    months["march"] = 31;
    months["april"] = 30;
    months["may"] = 31;
    months["june"] = 30;
    months["july"] = 31;
    months["august"] = 31;
    months["september"] = 30;
    months["october"] = 31;
    months["november"] = 30;
    months["december"] = 31;

    cout << "june -> " << months["june"] << endl;
    map<const char*, int, ltstr>::iterator cur  = months.find("june");
    map<const char*, int, ltstr>::iterator prev = cur;
    map<const char*, int, ltstr>::iterator next = cur;
    ++next;
    --prev;
    cout << "Previous (in alphabetical order) is " << (*prev).first << endl;
    cout << "Next (in alphabetical order) is " << (*next).first << endl;
    return 0;
}

(5)map再例

#include <map>
#include <iostream>

using namespace std;

int main( )
{
    map <int, int> m1, m2, m3;
    map <int, int>::iterator m1_Iter;

    m1.insert ( pair <int, int>  ( 1, 10 ) );
    m1.insert ( pair <int, int>  ( 2, 20 ) );
    m1.insert ( pair <int, int>  ( 3, 30 ) );
    m2.insert ( pair <int, int>  ( 10, 100 ) );
    m2.insert ( pair <int, int>  ( 20, 200 ) );
    m3.insert ( pair <int, int>  ( 30, 300 ) );

    cout << "The original map m1 is:";
    for ( m1_Iter = m1.begin( ); m1_Iter != m1.end( ); m1_Iter++ )
        cout << " " << m1_Iter->second;
    cout   << "." << endl;

    // This is the member function version of swap
    //m2 is said to be the argument map; m1 the target map
    m1.swap( m2 );

    cout << "After swapping with m2, map m1 is:";
    for ( m1_Iter = m1.begin( ); m1_Iter != m1.end( ); m1_Iter++ )
        cout << " " << m1_Iter -> second;
    cout  << "." << endl;
    cout << "After swapping with m2, map m2 is:";
    for ( m1_Iter = m2.begin( ); m1_Iter != m2.end( ); m1_Iter++ )
        cout << " " << m1_Iter -> second;
    cout  << "." << endl;
    // This is the specialized template version of swap
    swap( m1, m3 );

    cout << "After swapping with m3, map m1 is:";
    for ( m1_Iter = m1.begin( ); m1_Iter != m1.end( ); m1_Iter++ )
        cout << " " << m1_Iter -> second;
    cout   << "." << endl;
    return 0;
}

(6)map三例

#include <algorithm>
#include<map>
#include<iterator>
#include<iostream>
#include<cstring>
using namespace std;

int main()
{
    map<char,int> mymap;
    mymap['a']=10;
    mymap['b']=60;
    mymap['c']=30;
    mymap['d']=90;
    mymap['e']=50;

    map<char,int> second(mymap);
    map<char,int> third(mymap.begin(),mymap.end());
    map<char,int>::key_compare key_comp;
    map<char,int>::iterator it;
    it=mymap.begin();
    for (;it!=mymap.end();it++)
    {
        cout<<it->first<<":"<<it->second<<endl;
    }
    cout<<"================================="<<endl;
    second.clear();
    second['a']=1002;
    second['b']=10023;
    while (!second.empty())
    {
        cout << second.begin()->first << " => ";
        cout << second.begin()->second << endl;
        second.erase(second.begin());
    }
    cout<<"================================="<<endl;
    mymap.insert(pair<char,int>('f',100) );
    mymap.insert(pair<char,int>('g',200) );
    cout<<"f => " <<mymap.find('f')->second<<endl;
    cout<<"g => " <<mymap.find('g')->second<<endl;

    cout<<"================================="<<endl;
    key_comp=mymap.key_comp();
    cout << "mymap contains:\n";

    char highest=mymap.rbegin()->first;     // key value of last element

    it=mymap.begin();
    do {
        cout << (*it).first << " => " << (*it).second << endl;
    } while ( key_comp((*it++).first, highest) );

    cout << endl;
    return 0;
}
时间: 2024-11-09 00:35:41

C++范型程序补充阅读的相关文章

C++实践参考:程序填空(范型程序设计)

[项目:程序填空]下面程序运行后,输出结果如下: 请填空将程序补充完整. #include <iostream> #include <vector> #include <algorithm> #include <functional> using namespace std; void Show(double); int main() { double arr1[5] = {2, 4, 8, 10, 16}; double arr2[5] = {1, 3,

基于范型的java函数式编程(一)

编程|函数 注:在您阅读本篇的时候,希望你对Java Generic(范型)能够有所了解和明白. 记:周末在给javaparty讲FP中,很多人似乎对fp并不关心,也认为java中fp的作用不大.其实这是个很大的观念错误,范型的发展,对java的函数式编程支持很大,对Functor的影响也非常大.Functor在算法.逻辑.条件计算.规则引擎等等方面,都会有很大的作为,这个影响可就会深远的多了.-- 估且以此篇的开端,唤醒java开发者对FP in Java的重新认识. 周六给javaparty

《SOA Web Service合约设计与版本化》—第1章1.6节补充阅读

1.6 补充阅读SOA Web Service合约设计与版本化下面是一些推荐的补充书目,可以进一步阐释本书中包含的关键主题. SOA Principles of Service Design(中译版<SOA服务设计原则>)关于面向服务设计范型的综合参考书,包含本书中引用到的所有原则的全面描述:SOA Design Patterns 该书提供了设计模式的详尽目录,其中许多模式都是和Web服务合约设计与版本化相关的.你可以从http://www.soapatterns.org检索到这些模式的简单描

Java网络协议 TCP和客户端/服务器范型

服务器|客户端|网络 在网络编程中(同样在其它形式的通讯中,例如数据库编程),使用套接字的应用程序也被分为两类--客户端程序和服务器程序.你可能对"客户端/服务器编程"术语比较熟悉,尽管这个术语的准确意思你不一定清楚.下面的范例就是讨论这个主题. 1. 客户端/服务器范型 客户端/服务器范型把软件分为两类--客户端程序和服务器程序.客户端软件启动一个连接并发送请求,而服务器软件监听连接并处理请求.在UDP编程环境中,没有建立实际的连接,并且UDP应用程序可以在相同的套接字上建立并接收请

.NET 2.0 基础类库中的范型——范型集合

集合 范型集合毫无疑问,范型最典型的应用莫过于范型集合了.在 .NET 2.0 中提供了已有集合类和接口的范型版本,它们位于 System.Collections.Generic 命名空间中. .NET 2.0 中新的范型集合类并不是简单的在已有非范型集合类的设计上多加了个范型参数 T 而已.新的范型集合类的设计充分吸收了已有设计中的合理之处并摒弃了一些不甚合理之处,同时引入了新的针对范型的设计.所以,新的范型类和接口的设计应该更加合理和有效,不过 .NET 程序员则需要花些时间学习新的设计并了

.NET 2.0 基础类库中的范型——Functional Programming

Functional ProgrammingFunctional Programming 不是一个新鲜的概念了,例如 C++ 虽然不是一门 Functional Programming 语言,但对它也有变通的支持--通过使用模板,函数对象(Function Objects)和运算符重载等手段,STL.Boost 等库提供了巧妙无比的.高性能的算法和功能.长久以来似乎 C++ 能实现的这些特性对于诸如 Java 和 C# 这些强调类型安全的面向对象的编程语言和框架来说是绝缘的.现在,在 CLR 范

在Eclipse 3.1中体验J2SE 5.0的新特性: 第三部分 :范型

J2SE 5.0 (Tiger)的发布是Java语言发展史上的一个重要的里程碑, 是迄今为止在 Java 编程方面所取得的最大进步. J2SE 5.0提供了很多令人激动的特性.这些特性包括范型(generics)的支持, 枚举类 型(enumeration)的支持, 元数据(metadata)的支持, 自动拆箱(unboxing)/装箱 (autoboxing), 可变个数参数(varargs), 静态导入(static imports), 以及新的线程架 构(Thread framework)

《设计模式解析(第2版•修订版)》—第1章 1.6节面向对象范型

1.6 面向对象范型 设计模式解析(第2版•修订版) 使用对象将责任转移到更局部的层次 面向对象范型以对象概念为中心,一切都集中在对象上.编写代码时是围绕对象而非函数进行组织的. 对象是什么?对象传统上被定义为带有方法(面向对象领域称呼函数的术语)的数据.糟糕的是,这是一种非常有局限性的对象观.稍后我会给出一个更好的对象定义(在第8章中还会谈到).我说到对象的数据时,可能指数值和字符串这样的简单事物,也可能指其他对象. 使用对象的优点在于,可以定义自己负责自己的事物(参见表1-2).对象天生就知

《设计模式解析(第2版•修订版)》—第1章 1.2节面向对象范型之前:功能分解

1.2 面向对象范型之前:功能分解 设计模式解析(第2版•修订版) 功能分解是一种处理复杂问题的自然方法 让我们从对一种常用的软件开发方法的考察开始吧.如果给你一个任务,要编写一段代码,访问在数据库中存储的形状描述然后显示出来.按照所需要的步骤来思考,是一种很自然的选择.比如,你可能认为应该按照以下步骤解决这个问题. 1.在数据库中找到形状列表. 2.打开形状列表. 3.按某种规则将列表排序. 4.在显示器上显示各个形状. 还可以选取以上任意一个步骤,进一步分解成实现所必需的若干步.例如,可以将