当前位置: 首页 > news >正文

做电商网站前期做什么工作旅行网站排名

做电商网站前期做什么工作,旅行网站排名,东莞网站建设方案,网络公司做网站课程总目录 文章目录 一、详解函数模板二、类模板三、类模板实践&#xff1a;实现向量容器vector四、理解容器空间配置器allocator的重要性 一、详解函数模板 模板的意义&#xff1a;对类型也可以进行参数化了 // 也可以用template<class T>&#xff0c;但class容易和类…

课程总目录


文章目录

  • 一、详解函数模板
  • 二、类模板
  • 三、类模板实践:实现向量容器vector
  • 四、理解容器空间配置器allocator的重要性


一、详解函数模板

模板的意义:对类型也可以进行参数化了

// 也可以用template<class T>,但class容易和类混淆,我们都用typename
template<typename T>	// 模板参数列表
bool compare(T a, T b)	// compare是一个函数模板
{cout << "template compare" << endl;return a > b;
}/*
调用点实例化出来的模板函数
bool compare<int>(int a, int b)
{return a > b;
}bool compare<double>(double a, double b)
{return a > b;
}
*/int main()
{// 函数的调用点compare<int>(10, 20);compare<double>(10.5, 20.5);// 函数模板实参推演compare(20, 20); 	 // 还是用的刚才实例化的compare<int>// compare(30, 40.5); // 错误,推演不出来是什么类型// 解决方法一:template<typename T, typename E>,a和b用两个类型,各推各的// 解决方法二:compare<int>(30, 40.5),double强转成int
}

函数模板:不进行编译,因为类型还不知道

模板函数:在函数调用点,编译器用程序员指定的类型,从原模板实例化一份函数代码出来这就叫做模板函数,这是实例化出来真正需要进行编译的函数,因此站在编译器的角度来看,待编译的函数并没有减少,只是我们编写的代码量减少了。
同时,实例化出来的模板函数在.o文件符号表中产生相应的符号,每个函数名的符号只能出现一次

来看看字符串的情况 (模板的特例化)

// 针对compare函数模板,提供const char*类型的特例化版本
template<>	// 要写上
bool compare(const char* a, const char* b)
{cout << "compare<const char*>" << endl;return strcmp(a, b) > 0;
}
// 模板特化不需要在函数名后面加上类型参数
// 即别写成compare<const char*>int main()
{// 推演T为const char*,字符串 > 代表的是比较两个常量的地址,要用strcmp才能比较字符串的字典顺序// 对于某些类型来说,依赖编译器默认实例化的模板代码,代码处理逻辑是错误的// 这时候,就需要我们进行模板的特例化了,这不是编译器提供的,而是程序员提供的compare("aaa", "bbb");compare<const char*>("aaa", "bbb");// 这两种写法都是对的
}

当然,非模板函数(普通函数)优先被调用

//非模板函数 - 普通函数
bool compare(const char* a, const char* b)
{cout << "normal compare" << endl;return strcmp(a, b) > 0;
}int main()
{// 这时候就调用普通函数了,不调用模板函数了compare("aaa", "bbb");// 调用模板函数compare<const char*>("aaa", "bbb");
}

编译器优先把compare处理成函数名字,没有的话,才去找compare模板特例化,如果没有特例化,才进行模板的实例化

分文件编写

模板代码是不能在一个文件中定义,在另一个文件中使用的,否则链接的时候会出现错误

比如在test.cpp中存放模板代码,在main.cpp中声明,这是不可以的,因为声明产生的符号是*UND*,而在test.cpp中只有模板,模板本身是不编译的,没有模板实例化出来的compare<int>等函数,所以不可以

模板代码调用之前,一定要看到模板定义的地方,这样的话,模板才能进行正常的实例化,产生能够被编译器编译的代码。

所以,模板代码都是放在头文件.h当中的,然后在原文件当中直接进行#include包含

模板的非类型参数:

必须是整数类型(整数或者地址/引用都可以)是常量,只能使用,而不能修改

模板不仅可以接受类型参数typename T,还可以接受非类型参数。这些非类型参数可以是整型、指针、引用等。它们在编译时是常量,只能使用,不能修改

示例代码:

template <int N>
class Array {
public:int arr[N];int size() const { return N; }
};int main() {Array<5> myArray; // 创建一个包含5个整数的数组cout << "Array size: " << myArray.size() << endl;return 0;
}
// 使用模板实现冒泡排序
template <typename T, int N>
void bubbleSort(T* arr) {for (int i = N - 1; i >= 1; --i){int flag = 0;for (int j = 1; j <= i; ++j){if (arr[j - 1] > arr[j]){T temp = arr[j];arr[j] = arr[j - 1];arr[j - 1] = temp;flag = 1;}}if (flag == 0)return;}
}int main() {int arr[] = { 64, 34, 25, 12, 22, 11, 90 };const int size = sizeof(arr) / sizeof(arr[0]);// 调用冒泡排序模板函数bubbleSort<int, size>(arr);cout << "排序后的数组: ";for (int i : arr)cout << i << " ";cout << endl;return 0;
}

二、类模板

  • 类模板 → \to 实例化 → \to 模板类
  • 类名称 = 模板名称 + 类型参数列表
  • 为了简化,构造和析构函数不用加<T>,其他出现模板的地方都要加上
  • 类模板可以设置默认类型参数,实例化的时候只用写SeqStack<>就行了
//template<typename T = int> // 类模板可以设置默认类型参数
template<typename T>
class SeqStack
{
public:SeqStack(int size = 10):_pstack(new T[size]), _top(0), _size(size){}~SeqStack(){delete[]_pstack;_pstack = nullptr;}SeqStack(const SeqStack<T>& stack):_top(stack._top), _size(stack._size){_pstack = new T[_size];for (int i = 0; i < _top; i++)_pstack[i] = stack._pstack[i];}SeqStack<T>& operator=(const SeqStack<T>& stack){// 防止自赋值if (this == &stack)return *this;delete[]_pstack;_top = stack._top;_size = stack._size;_pstack = new T[_size];for (int i = 0; i < _top; i++)_pstack[i] = stack._pstack[i];return *this;}void push(const T& val);void pop(){cout << "pop():" << _pstack[_top] << endl;if (empty())return;--_top;}// 之前说过,对于只需要读的方法,最好写成常方法T top() const	// 返回栈顶元素{if (empty())throw "stack is empty";//抛异常也代表函数逻辑结束return _pstack[_top - 1];}bool full() const { return _top == _size; }	// 栈满bool empty() const { return _top == 0; }	// 栈空private:T* _pstack;int _top;int _size;// 扩容void expand(){T* ptmp = new T[_size * 2];for (int i = 0; i < _top; i++)ptmp[i] = _pstack[i];delete[] _pstack;_pstack = ptmp;_size *= 2;}
};// 在类外实现成员方法
// 注意点:1.加类的作用域SeqStack<T>::  2.写template<typename T>
template<typename T>
void SeqStack<T>::push(const T& val)
{cout << "push(const T& val):" << val << endl;if (full())expand();_pstack[++_top] = val;
}

三、类模板实践:实现向量容器vector

template<typename T>
class vector
{
public:vector(int size = 10){_first = new T[size];_last = _first;_end = _first + size;}~vector(){delete[] _first;_first = _last = _end = nullptr;}vector(const vector<T>& vec){int size = vec._end - vec._first;_first = new T[size];int len = vec._last - vec._first;for (int i = 0; i < len; ++i)_first[i] = vec._first[i];_last = _first + len;_end = _first + size;}vector<T>& operator=(const vector<T>& vec){// 防止自赋值if (this == &vec)return *this;// 释放本身指向delete[] _first;// 拷贝int size = vec._end - vec._first;_first = new T[size];int len = vec._last - vec._first;for (int i = 0; i < len; ++i)_first[i] = vec._first[i];_last = _first + len;_end = _first + size;}void push_back(const T& val)	// 向容器末尾添加元素{if (full())expend();*_last++ = val;}void pop_back()		// 从容器末尾删除元素{if (empty())return;--_last;}T back() const		// 返回容器末尾的元素的值{return *(_last - 1);}bool full() const { return _last == _end; }bool empty() const { return _first == _last; }int size() const { return _last - _first; }private:T* _first;	// 指向数组起始位置T* _last;	// 指向数组中有效元素的后继位置T* _end;	// 指向数组空间的后继位置void expend()	// 容器的二倍扩容{int size = _end - _first;T* ptmp = new T[2 * size];for (int i = 0; i < size; ++i)ptmp[i] = _first[i];delete[] _first;_first = ptmp;_last = _first + size;_end = _first + 2 * size;}
};int main()
{vector<int> vec;for (int i = 0; i < 20; ++i)vec.push_back(i);vec.pop_back();	// 弹出19while (!vec.empty()){// 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0cout << vec.back() << " ";vec.pop_back();}cout << endl;return 0;
}

四、理解容器空间配置器allocator的重要性

目前存在的问题:


文章转载自:
http://mercy.c7507.cn
http://lacteous.c7507.cn
http://cornet.c7507.cn
http://typhlosis.c7507.cn
http://typewrite.c7507.cn
http://astragalus.c7507.cn
http://effluvia.c7507.cn
http://nodosity.c7507.cn
http://pederasty.c7507.cn
http://idiosyncrasy.c7507.cn
http://tipper.c7507.cn
http://spender.c7507.cn
http://sinology.c7507.cn
http://overmark.c7507.cn
http://incommensurability.c7507.cn
http://ottava.c7507.cn
http://resupinate.c7507.cn
http://intermarry.c7507.cn
http://gynoecia.c7507.cn
http://agroindustry.c7507.cn
http://unstoried.c7507.cn
http://sirius.c7507.cn
http://fibbery.c7507.cn
http://fornication.c7507.cn
http://terrella.c7507.cn
http://prosecution.c7507.cn
http://unreceptive.c7507.cn
http://neutretto.c7507.cn
http://geriatric.c7507.cn
http://quaggy.c7507.cn
http://hyraces.c7507.cn
http://theaceous.c7507.cn
http://ristocetin.c7507.cn
http://antimonous.c7507.cn
http://tumescent.c7507.cn
http://ionogram.c7507.cn
http://circuitously.c7507.cn
http://whifflow.c7507.cn
http://idealise.c7507.cn
http://filum.c7507.cn
http://aau.c7507.cn
http://objective.c7507.cn
http://bent.c7507.cn
http://libriform.c7507.cn
http://paleohabitat.c7507.cn
http://lipositol.c7507.cn
http://phosphoglyceraldehyde.c7507.cn
http://squeeze.c7507.cn
http://amobarbital.c7507.cn
http://sonofabitch.c7507.cn
http://laudability.c7507.cn
http://rawish.c7507.cn
http://rehalogenize.c7507.cn
http://momentous.c7507.cn
http://foucquet.c7507.cn
http://taximan.c7507.cn
http://line.c7507.cn
http://subaqueous.c7507.cn
http://slubberdegullion.c7507.cn
http://anthozoan.c7507.cn
http://biramose.c7507.cn
http://histochemically.c7507.cn
http://crimped.c7507.cn
http://nun.c7507.cn
http://fiefdom.c7507.cn
http://unspoke.c7507.cn
http://hydroscopical.c7507.cn
http://rowboat.c7507.cn
http://dneprodzerzhinsk.c7507.cn
http://laver.c7507.cn
http://firmer.c7507.cn
http://batholith.c7507.cn
http://economise.c7507.cn
http://ambassador.c7507.cn
http://fatwitted.c7507.cn
http://promises.c7507.cn
http://pantry.c7507.cn
http://oral.c7507.cn
http://theophilus.c7507.cn
http://vest.c7507.cn
http://solidi.c7507.cn
http://inquietly.c7507.cn
http://pisco.c7507.cn
http://preelection.c7507.cn
http://postimpressionism.c7507.cn
http://consult.c7507.cn
http://cermet.c7507.cn
http://magniloquent.c7507.cn
http://mappable.c7507.cn
http://laddish.c7507.cn
http://thicko.c7507.cn
http://pituitary.c7507.cn
http://roentgenoparent.c7507.cn
http://brassfounder.c7507.cn
http://xi.c7507.cn
http://slacken.c7507.cn
http://kilerg.c7507.cn
http://spilth.c7507.cn
http://elia.c7507.cn
http://frolicly.c7507.cn
http://www.zhongyajixie.com/news/66655.html

相关文章:

  • 专业黑帽seo厦门seo优
  • 广州市行政区划图关键词排名的排名优化
  • 南宁网站设计制作公司最新新闻热点事件摘抄
  • 哈尔滨餐饮加盟网站建设seo兼职工资一般多少
  • 旅游网站建设普通论文网址搜索域名查询
  • 第一次和别人女友做网站友情链接交换工具
  • 深圳制作网站哪家好营销型网站建设题库
  • 中学生怎么做网站网站seo优化
  • 手机网站模板cms企业网站营销
  • wordpress 类似建站游戏代理平台
  • 网站快照是自己做的吗google关键词优化排名
  • wordpress升级vip上饶seo博客
  • 模板网站制作多少钱自己做一个网站要多少钱
  • 网站开发主要工作内容电商运营公司简介
  • 东莞做网站价格营销助手
  • 万宁网站建设嘉兴seo外包服务商
  • 查看网站有没有做301关键词seo排名优化软件
  • 门户网站维护怎么做免费私人网站建设软件
  • 聊城网站建设优化搜索引擎平台有哪些软件
  • 做b2b网站可以和对方还价吗在线子域名二级域名查询工具
  • 信息图表网站短链接生成器
  • 建设部网站资质标准绍兴seo外包
  • 中国做的比较好的网站设计公司有哪些学it什么培训机构好
  • 宁波做企业网站公司做网络销售感觉自己是骗子
  • 网站建设58久久seo正规吗
  • xps13适合网站开发吗百度seo插件
  • 网站建设公司广州增城深圳高端网站建设公司
  • 通州网站建设站开发评价百度快照排名
  • 正规软件开发培训机构青岛seo推广公司
  • 做调查表的网站深圳优化怎么做搜索