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

网站开发功能添加价格列表推广竞价账户托管

网站开发功能添加价格列表,推广竞价账户托管,做网站购买服务器,腾讯云主机永久免费STL中大家最耳熟能详的可能就是容器,容器大致可以分为两类,序列型容器(SequenceContainer)和关联型容器(AssociativeContainer)这篇文章中将会重点介绍STL中的各种序列型容器和相关的容器适配器。主要内容包括 std::vectorstd::arraystd::dequestd::queuestd::stackstd::…

STL中大家最耳熟能详的可能就是容器,容器大致可以分为两类,序列型容器(SequenceContainer)和关联型容器(AssociativeContainer)这篇文章中将会重点介绍STL中的各种序列型容器和相关的容器适配器。主要内容包括

  • std::vector
  • std::array
  • std::deque
  • std::queue
  • std::stack
  • std::priority_queue
  • std::list
  • std::forward_list

std::vector

提到STL,大部分人的第一反应是容器,而提到容器大部分人首先想到的是std::vector。斯特劳斯特卢普的观点来说,std::vector是所有的容器中的首先,如果你不清楚应该使用哪个容器,那就选std::vector吧(当然,你不应该不清楚选哪个容器,合格是程序员对自己写的代码应该要了如指掌)。

std::vector的使用非常简单,下面是一个简单的例子。

#include <vector>                               // 1int main(int argc, char* argv[]) {std::vector<int> ages = { 1, 2, 3, 4 };     // 2return 0;
}

头文件

// 1中引入了std::vector的头文件,需要注意的是所有C++标准库的头文件都是没有.h结尾的。这么做是为了区分,C标准库的头文件和C++标准库的头文件。比如最具代表性的:

#include <string.h>     // C 标准库头文件,包含 strlen,memset 等函数
#include <string>       // C++ 标准库头文件,包含 std::string 类

此外对于所有C标准库头文件,如果你是在C++项目中引用,你应该使用#include <cxxx>这种方式而不是#include <xxx.h>这种形式。也就是说我们应该使用#include <cstring>而不是#include <string.h>

std::vector 还是 vector

我见过很多的人(包括很多书)的习惯是在源文件头部写上using namespace std;然后在代码中使用vector<int>,而不是直接使用std::vector<int>

我个人的习惯是直接使用std::vector<int>,因为namespace对我来说是一个模块,写明了std::有更强的模块内聚表达力,而且也不太容易出现名字碰撞。

初始化

// 2在构造std::vector的时候直接给了初始值,这是C++11的特性,在C++11之前不能这样写,有一种大致等同的写法如下:

int initilizer[4] = { 1, 2, 3, 4 };
std::vector<int> ages(initilizer, initilizer + 4);

std::vector<int> ages = { 1, 2, 3, 4 }这种写法实际上从语法分析上来说是分成下面几个步骤的:

  1. { 1, 2, 3, 4 } 被编译器构造成一个临时变量std::initializer_list<int>,然后使用临时变量构造一个临时变量 std::vector<int>,然后再用 std::vector<int>的拷贝构造函数构造最终的ages
std::initializer_list<int> initilizer;
std::vector<int> tmp(initilizer);
std::vector<int> ags(tmp);

当然上面的分析只是语法上的分析,绝大部分编译器都可以优化掉tmp,而且因为{1, 2, 3, 4}转换成std::initializer_list是编译器在编译器完成的事情,所以其实效率比我们想象中要高一些。

std::vector

std::vector有一个特化版本std::vector<bool>,用于实现dynamic bitset,需要注意的是,这个特化版本并不是容器,它的迭代器无法很好的适配STL中的所有算法。它的存在是为了节省空间,它的每一个元素只占用一位而不是一个字节。为了实现这种优化,operator[]返回的是一个代理类,你没有办法取单个元素的地址。通常的建议是,如果你不需要动态的bitset,你可以使用std::bitset,如果你需要dynamic bitset你可以考虑使用std::deque<bool>替代。

push_back vs emplace_back

C++11在容器尾部添加一个元素调用的函数是push_back,它在libcxx中的实现如下:

template <class _Tp, class _Allocator>
inline _LIBCPP_INLINE_VISIBILITY
void
vector<_Tp, _Allocator>::push_back(const_reference __x)
{if (this->__end_ != this->__end_cap()){__RAII_IncreaseAnnotator __annotator(*this);__alloc_traits::construct(this->__alloc(),_VSTD::__to_raw_pointer(this->__end_), __x);__annotator.__done();++this->__end_;}else__push_back_slow_path(__x);
}

这里存在两次元素的构造,一次是 __x 参数的构造,一次是容器内部原始的拷贝构造。也就是说使用拷贝构造在末尾构造一个新的元素。emplace_back是C++11为减少其中一次拷贝而引入的新的接口,在libcxx中的实现如下

template <class _Tp, class _Allocator>
template <class... _Args>
inline
#if _LIBCPP_STD_VER > 14
typename vector<_Tp, _Allocator>::reference
#else
void
#endif
vector<_Tp, _Allocator>::emplace_back(_Args&&... __args)
{if (this->__end_ < this->__end_cap()){__RAII_IncreaseAnnotator __annotator(*this);__alloc_traits::construct(this->__alloc(),_VSTD::__to_raw_pointer(this->__end_),
http://www.yidumall.com/news/87042.html

相关文章:

  • 手机怎样建立自己网站seo顾问是什么职业
  • 网站建设规划方案论文百度图片搜索入口
  • 生成二维码的网站阿里云域名
  • 做医疗竞价网站老域名购买
  • 外贸网站制作费用今日全国疫情最新消息
  • 福州智能建站百度导航如何设置公司地址
  • 旅游网站怎么做才能被关注你就知道首页
  • wordpress自定义类型模板企业seo顾问服务阿亮
  • 优惠活动推广文案龙岩seo
  • 网站如何运营赚钱本网站三天换一次域名
  • 医院网站建设实施方案seo网站推广是什么
  • wordpress 内容格式北京seo外包 靠谱
  • ecshop网站返回顶部代码天津seo诊断技术
  • 北京网站制作到诺然微信指数官网
  • 网店代运营骗局流程网站页面seo
  • 外贸网站设计企业培训视频
  • 南京做网站建设搭建的公司2022百度收录越来越难了
  • 国外flash网站模板百度软文推广怎样收费
  • 深圳网络推广运营企业优化设计答案
  • 屯昌网站建设优化关键词可以选择哪个工具
  • 导购网站需要备案吗今日关注
  • 网络空间安全考研seo怎么发文章 seo发布工具
  • 深圳网站建设黄浦网络-骗钱优化网站标题
  • vue做的网站有什么怎么推广app让人去下载
  • 企业网站托管泽成杭州seo网站推广排名
  • 网站如何做seo重庆网页优化seo公司
  • 做网站商城汕头搜索引擎优化服务
  • 长春做网站公司优化师
  • 网站域名解析ip地址外贸电商平台哪个网站最好
  • 淘宝做批发的网站定制型营销网站建设