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

宠物网站的设计与实现百度推广二级代理商

宠物网站的设计与实现,百度推广二级代理商,学校网站报价单,哈尔滨网站seo一 emplace() emplace_hint() try_emplace()区别 1. emplace template class... Args std::pairiterator, bool emplace( Args... args ); 若容器中没有拥有该键的元素#xff0c;则向容器插入以给定的 args 原位构造的新元素。 细心地使用 em…一 emplace()  emplace_hint() try_emplace()区别 1. emplace template class... Args std::pairiterator, bool emplace( Args... args ); 若容器中没有拥有该键的元素则向容器插入以给定的 args 原位构造的新元素。 细心地使用 emplace 允许在构造新元素的同时避免不必要的复制或移动操作。 以与提供给 emplace 严格相同的实参通过 std::forwardArgs(args)... 转发调用新元素即 std::pairconst Key, T的构造函数。 即使容器中已有拥有该关键的元素也可能构造元素该情况下新构造的元素将被立即销毁。 没有迭代器或引用会失效。 参数 args-要转发给元素构造函数的实参 返回值 返回由指向被插入元素或若不发生插入则为既存元素的迭代器和指代插入是否发生的 bool若发生插入则为 true否则为 false构成的 pair。 异常 如果因为任何原因抛出了异常那么此函数无效果强异常安全保证。 复杂度 与容器大小成对数。 2. emplace_hint() template class... Args  iterator emplace_hint( const_iterator hint, Args... args ); (C11 起) 插入元素到尽可能靠近正好在 hint 之前的位置。原位构造元素即不进行复制或移动操作。 与提供给函数的严格相同的实参以 std::forwardArgs(args)... 转发之调用元素类型 value_type即 std::pairconst Key, T的构造函数。 没有迭代器或引用会失效。 参数 hint-指向将插入新元素到其前的位置的迭代器args-转发给元素构造函数的实参 返回值 返回指向新插入元素的迭代器。 若因为元素已存在而失败则返回指向拥有等价键的既存元素的迭代器。 异常 若任何操作抛出异常则此函数无效果强异常保证。 复杂度 通常与容器大小成对数但若新元素被插入到恰于 hint 前则为均摊常数。 3. try_emplace() template class... Args std::pairiterator, bool try_emplace( const Key k, Args... args ); (1)(C17 起) template class... Args std::pairiterator, bool try_emplace( Key k, Args... args ); (2)(C17 起) template class... Args  iterator try_emplace( const_iterator hint, const Key k, Args... args ); (3)(C17 起) template class... Args  iterator try_emplace( const_iterator hint, Key k, Args... args ); (4)(C17 起) 向容器插入具有键 k 和以 args 构造的值的新元素如果容器中没有这个键的元素。 1) 若容器中已存在等价于 k 的键则不做任何事。否则行为类似 emplace但以 value_type(std::piecewise_construct, std::forward_as_tuple(k), std::forward_as_tuple(std::forwardArgs(args)...)) 构造元素。 2) 若容器中已存在等价于 k 的键则不做任何事。否则行为类似 emplace但以 value_type(std::piecewise_construct, std::forward_as_tuple(std::move(k)), std::forward_as_tuple(std::forwardArgs(args)...)) 构造元素。 3) 若容器中已存在等价于 k 的键则不做任何事。否则行为类似 emplace_hint但以 value_type(std::piecewise_construct, std::forward_as_tuple(k), std::forward_as_tuple(std::forwardArgs(args)...)) 构造元素。 4) 若容器中已存在等价于 k 的键则不做任何事。否则行为类似 emplace_hint但以 value_type(std::piecewise_construct, std::forward_as_tuple(std::move(k)), std::forward_as_tuple(std::forwardArgs(args)...)) 构造元素。 没有迭代器或引用会失效。 参数 k-用于查找和若找不到则插入的键hint-指向位置的迭代器新元素将插入到其前args-转发给元素构造函数的实参 返回值 1,2) 同 emplace。 3,4) 同 emplace_hint。 复杂度 1,2) 同 emplace。 3,4) 同 emplace_hint。 注解 不同于 insert 或 emplace若不发生插入则这些函数不从右值实参移动这令操纵值为仅移动类型的映射如 std::mapstd::string, std::unique_ptrfoo 更为容易。另外try_emplace 分开处理键和给 mapped_type 的实参这点不同于要求实参构造 value_type即一个 std::pair的 emplace。 上面主要是从cppreference拷贝的对接口的描述接下来主要分享下这三个函数之前的部分区别 4. 区别 这里从两个方面来考虑 a. 就地构造时传入参数的区别 首先我们来看个例子 #include iostream #include memory #include string #include mapusing ValueType std::string; const ValueType dv aaaaaaaaaaaaaaaaaaaaaaaa; constexpr int maxSize 10;class Widget { public:Widget(ValueType value dv) : value{value}{std::cout Widget(ValueType) constructor: this std::endl;}Widget(const Widget w) : value{w.value}{std::coutcopy constructor std::endl;}Widget operator(const Widget rhs){if (this ! rhs){value rhs.value;//assign new resource}std::cout copy assignment constructor std::endl;return *this;}Widget(Widget w) : value{std::move(w.value)}{std::cout move constructor std::endl;}Widget operator(Widget rhs){if (this ! rhs){value std::move(rhs.value);//assign new resource}std::cout move assignment constructor std::endl;return *this;}~Widget(){if (value.empty()){std::cout 0~destructor: this std::endl;}else{value.clear();std::cout ~destructor: this std::endl;}}void print(){std::cout value: value : this std::endl;} private:ValueType value{}; };int main() {auto up1 std::make_uniquestd::string(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);auto up2 std::move(up1);if (up1 ! nullptr){std::cout up1 is not nullptr std::endl;}else{std::cout up1 is nullptr std::endl;}return 0; } 在上面这个代码中由于up1 移动给了up2所以up1此时不能在使用通过代码测试发现up1是nullptr 接着我们来看下emplace、emplace_hint、try_emplace在插入键值已经存在的情况下的区别: #include iostream #include memory #include string #include mapusing ValueType std::string; const ValueType dv aaaaaaaaaaaaaaaaaaaaaaaa; constexpr int maxSize 10;class Widget { public:Widget(ValueType value dv) : value{value}{std::cout Widget(ValueType) constructor: this std::endl;}Widget(const Widget w) : value{w.value}{std::coutcopy constructor std::endl;}Widget operator(const Widget rhs){if (this ! rhs){value rhs.value;//assign new resource}std::cout copy assignment constructor std::endl;return *this;}Widget(Widget w) : value{std::move(w.value)}{std::cout move constructor std::endl;}Widget operator(Widget rhs){if (this ! rhs){value std::move(rhs.value);//assign new resource}std::cout move assignment constructor std::endl;return *this;}~Widget(){if (value.empty()){std::cout 0~destructor: this std::endl;}else{value.clear();std::cout ~destructor: this std::endl;}}void print(){std::cout value: value : this std::endl;} private:ValueType value{}; }; void test1() {std::mapint, Widget m{};m.emplace(1, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);m.emplace(1, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);std::cout std::endl;m.emplace_hint(m.end(), 1, ccccccccccccccccccccccccccccccccccccccccc);std::cout std::endl;m.try_emplace(1, ddddddddddddddddddddddddddddddddddddddddd); } void test2() {std::unique_ptrWidget up1 std::make_uniqueWidget(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);std::unique_ptrWidget up2 std::make_uniqueWidget(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);std::unique_ptrWidget up3 std::make_uniqueWidget(ccccccccccccccccccccccccccccccccccccccccc);std::unique_ptrWidget up4 std::make_uniqueWidget(ddddddddddddddddddddddddddddddddddddddddd);std::mapint, std::unique_ptrWidget m{};m.emplace(1, std::move(up1));if (up1 ! nullptr){std::cout up1 is not nullptr std::endl;}else{std::cout up1 is nullptr std::endl;}m.emplace(1, std::move(up2));if (up2 ! nullptr){std::cout up2 is not nullptr std::endl;}else{std::cout up2 is nullptr std::endl;}m.emplace_hint(m.end(), 1, std::move(up3));if (up3 ! nullptr){std::cout up3 is not nullptr std::endl;}else{std::cout up3 is nullptr std::endl;}m.try_emplace(1, std::move(up4));if (up4 ! nullptr){std::cout up4 is not nullptr std::endl;}else{std::cout up4 is nullptr std::endl;} } int main() {//test1();test2();return 0; } output: 从上述代码结果可以看出 对于emplace和emplace_hint来说键值已经存在的情况下任然会move参数的数据而try_emplace在键值已经存在的情况下不会移动(move)参数的数据 b.性能的区别: 如果在就地构造不存在键值的数据时带有hint迭代器的效率有些情况下要比不带hint迭代器的效率高这是因为带有hint的已经查找过一次map表了而不带hint的还需要再次查找map。 #include iostream #include string #include map #include chrono using ValueType std::string; const ValueType dv aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; constexpr unsigned long int maxSize 999999;class Widget { public:Widget(ValueType value dv) : value{value}{std::cout Widget(ValueType) constructor: this std::endl;}Widget(const Widget w) : value{w.value}{std::coutcopy constructor std::endl;}Widget operator(const Widget rhs){if (this ! rhs){value rhs.value;//assign new resource}std::cout copy assignment constructor std::endl;return *this;}Widget(Widget w) : value{std::move(w.value)}{std::cout move constructor std::endl;}Widget operator(Widget rhs){if (this ! rhs){value std::move(rhs.value);//assign new resource}std::cout move assignment constructor std::endl;return *this;}~Widget(){if (value.empty()){std::cout 0~destructor: this std::endl;}else{value.clear();std::cout ~destructor: this std::endl;}}void print(){std::cout value: value : this std::endl;} private:ValueType value{}; };void logTime(std::string name, std::chrono::high_resolution_clock::time_point tp1, std::chrono::high_resolution_clock::time_point tp2) {std::chrono::durationsize_t, std::nano dur tp2 - tp1;std::cout name : std::chrono::duration_caststd::chrono::nanoseconds(dur).count() std::endl; }int main() {std::mapunsigned long int, std::string m1{};std::mapunsigned long int, std::string m2{};std::mapunsigned long int, std::string m3{};std::mapunsigned long int, std::string m4{};std::chrono::high_resolution_clock::time_point tp1 std::chrono::high_resolution_clock::now();for(unsigned long int i 0; i maxSize; i){if (m1.end() m1.find(i)){m1.emplace(i, dv);}}std::chrono::high_resolution_clock::time_point tp2 std::chrono::high_resolution_clock::now();for(unsigned long int i 0; i maxSize; i){if (auto iter m2.find(i); m2.end() iter){m2.emplace_hint(iter, i, dv);}}std::chrono::high_resolution_clock::time_point tp3 std::chrono::high_resolution_clock::now();for(unsigned long int i 0; i maxSize; i){if (m3.end() m3.find(i)){m3.try_emplace(i, dv);}}std::chrono::high_resolution_clock::time_point tp4 std::chrono::high_resolution_clock::now();for(unsigned long int i 0; i maxSize; i){if (auto iter m4.find(i); m4.end() iter){m4.try_emplace(iter, i, dv);}}std::chrono::high_resolution_clock::time_point tp5 std::chrono::high_resolution_clock::now();logTime(emplace() , tp1, tp2);logTime(emplace_hint() , tp2, tp3);logTime(try_emplace() , tp3, tp4);logTime(try_emplace(hint), tp4, tp5);return 0; }
http://www.huolong8.cn/news/341009/

相关文章:

  • 国内做免费的视频网站有哪些天元建设集团有限公司路桥工程分公司
  • 兼职网站建设策划书怎样做电商
  • 建设直播平台网站软件温州网站推广站建设
  • 网站模板下载百度云链接怎么做的滨州制作网站
  • 个人做论坛网站有哪些西安免费做网站价格
  • 网站建设中高低端区别阿城区建设小学网站
  • 有没有做市场评估的网站昆明网站seo技术厂家
  • 网络优化首先要有网站只让搜索引擎查看文章wordpress
  • 免费建公司网站的攻略百度推广有哪些售后服务
  • 网站底部流程上海好的网站设计公司
  • 做网站点击率赚钱吗有公司如何制作网站
  • 高端视觉网站阿里云搜索引擎网址
  • 设置一个网站到期页面网络设计专业包括哪些
  • 广州怎么建设一个网站中国建设银行河北省分行官方网站
  • 建设手机银行官方网站wordpress ssl插件
  • 公司做网络推广哪个网站好yahoo搜索引擎提交入口
  • 网站备案什么注销wordpress跨域登录
  • 遂宁做网站怎么打电话给网络服务商
  • 织梦移动网站后缀微信小程序开发哪个好
  • 网站建设最好的书籍是天猫网站设计
  • 网站外围网站怎么做做一个微信商城小程序多少钱
  • 广告图片网站源码监控网站模板下载
  • 如何抄袭网站网站建设无锡海之睿
  • 厦门网站建设中心深圳龙华大浪做网站公司
  • 金湖县网站建设wordpress 附件ftp
  • 做淘宝客的的网站有什么要求吗百度上海总部
  • 企业做网站的流程免费的seo网站
  • 做家装的网站好开网站需要哪些程序
  • 网站换空间会影响排名吗成都网站seo排名
  • 做网站南宁免费做网站哪里有