Generic Programming

STL
  • 容器
    • 顺序性容器:vector、list、deque(对于前端的插入效率更高)
    • 关联性容器:便于快速查值。set(只含有key)、map(一对对的key/value)
  • 泛型算法:提供了许多可作用于容器类及数组类型上的操作
    • find()
    • sort()
    • replace()

The Arithmetic of Pointers

Making Sense of Iterators

定义使用标准容器的iterator

       每个标准容器都提供有一个名为begin()end()的操作函数,返回的iterator分别指向第一个元素和指向最后一个元素的下一个位置。
       所以不管怎么定义一个iterator对象,都是对其进行赋值、比较、递增、提领操作。

  1. 迭代对象的类型决定如何访问下一元素
  2. iterator所指的元素类别决定提领操作的返回值

如果我们要定义iterator来指向容器的开始或者结尾

#include <vector>
#include <iterator>
// 以vector为例
typename vector<int>::iterator iter1 = vec.begin();
typename vector<int>::iterator end_iter = vec.end();
typename vector<int>::const_iterator iter2 = vec.begin(); //不允许修改

// 遍历操作
for (; iter1 != end_iter; ++iter1)
{
    cout << *iter1 << ' ';
}

注意 :为什么要在typename vector<int>::iterator使用typename

在vc6.0下,如果不加typename,是可以编译的;但是在gcc下,就不能。
原因大概是要让编译器认为iterator是一个类型,而不是数据成员(这里很模糊,也不知道是否正确,如果想起来查阅资料会补充的)

Operations Common to All Containers

容器类共通操作(包括string)
  • equality == 和inequality != ,返回truefalse
  • assignment = ,复制
  • empty() 返回truefalse
  • size() 返回容器类元素个数
  • clear() 删除所有元素
  • begin() 返回一个iterator,指向第一个元素
  • end() 返回一个iterator, 指向最后一个元素的下一个位置
  • insert() 插入
  • erase() 删除

Using the Sequential Containers

顺序容器的定义
list<int> slist;
vector<int> vec;
  • 特定大小
list<int> slist(100);
vector<int> vec(100);
  • 特定大小,每一个元素给定同样的初值
list<int> slist(100, -1); // 全是-1
vector<int> vec(100, 1);
  • 通过iterator产生容器
int ia[3] = {1, 2 ,3};
vector<int> fib(ia, ia + 3);
  • 复制
list<int> list1;
list<int> list2(list1);

Using the Generic Algorithms

#include <algorithm>
  • find():找到的iterator指向该目标,没找到指向last
  • binary_search():用于有序集合搜索,搜到目标返回true否则返回false
  • count()
  • search()

How to Design a Generic Algorthm

思想:点->面,不断的将一个算法泛型化
// bind2nd() 绑定适配器 还没有讲到
template <typename InputIterator, typename OutputIterator, typename Elemtype, typename Comp>
OutputIterator filter(InputIterator first, InputIterator last, OutputIterator at, const Elemtype &val, Comp pred)
{
    while ((first = find_if(first, last, bind2nd(pred, val))) != last) {
        cout << *first << endl;
        *at++ = *first++;
    }
    return at;
}
Function Object Adapter

绑定适配器(暂时没有详细内容)

Using a Map

使用
#include <map>
#include <string>
map<string, int> words;
// 输入key/value最简单的方式
words["iAmKey"] = 1;

// 统计次数
string str;
while (cin >> str)
    words[str]++;
查询map中是否存在key
  • 将key当成索引使用,但是如果map中没有,会将它放入map里
int count = 0;
if (!(count = words["lalala"])
    // 
  • 利用map的find()不是泛型的find(),入股哦存在会返回一个iterator,反之返回一个end()
words.find("lalala");
  • 利用map的count(),返回个数
if( words.count("fasdf"));
    // 

Using a Set

使用
#include <set>
#include <string>
set<string> iset;
插入
iset.insert(ival);
iset.insert(vec.begin(), vec.end());

How to Use Iterator Inserters

Using the iostream Iterator

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、 4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.m或d论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 、1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值