草庐IT

C++ 不同的 minmax 实现

因为您可能(不知道)使用std::minmax使用auto和temporary参数可能很危险。例如以下代码是UB因为std::minmax返回引用对,而不是值:autofun(){autores=std::minmax(3,4);returnres.first;}我想问一下有没有可能制作std::minmax函数在没有任何开销的情况下安全地或至少更安全地运行?我想出了这样的解决方案,但我不完全确定它是否等同于当前的minmax因为生成的程序集对于类似STL的实现和我的是不同的。所以问题是:我实现minmax的可能问题/缺点是什么?关于std-像一个://belowisstd-likem

c++ - glibcxx STL 在其 std::valarray::sum() 的实现中是否不正确?

我在玩弄valarrays当我碰到某些东西时,我认为是编译器的STL实现中的错误。这是我可以制作的最小示例:#include#include#include#include#includeusingnamespacestd;intmain(){valarrayY(0xf00d,1);valarray>X(Y,1);cout这将输出:$g++-std=c++17-O2-Wall-pedantic-pthreadmain.cpp&&./a.outY[0]=f00dX[0][0]=f00dX[0].size()=1X.sum().size()=0您可以在coliru编译并运行它为什么我认为这

c++ - 从 std::string 流式传输而不制作拷贝?

我有一个网络客户端,其请求方法采用std::streambuf*。此方法通过boost::iostreams::copy实现-将其转换为自定义std::streambuf-知道如何将数据写入网络API的派生类,效果很好。这意味着我可以将文件流式传输到请求中,而无需将其全部读入内存。然而,在某些情况下,必须发送不在文件中的大数据block,因此我包含了一个采用字符串的重载。为了避免重复流中的所有网络代码,显然我应该设置一个表示字符串的streambuf并调用其他方法。我想出的唯一方法是:std::istringstreamss(data);send(ss.rdbuf());不幸的是,is

c++ - std::stringstream 可以设置失败/坏位的方法?

我用于简单字符串拆分的一段常见代码如下所示:inlinestd::vectorsplit(conststd::string&s,chardelim){std::vectorelems;std::stringstreamss(s);std::stringitem;while(std::getline(ss,item,delim)){elems.push_back(item);}returnelems;}有人提到这会默默地“吞下”std::getline中发生的错误。当然,我同意是这样的。但我突然想到,在实践中这里可能会出现什么问题,我需要担心。基本上这一切都归结为:inlinestd::

c++ - 奇怪的 std::bad_alloc

据我所知,可以抛出std::bad_alloc的三个原因:进程请求的内存多于可提供的内存地址空间过于分散,无法满足对大块连续内存的请求堆管理数据结构已损坏我们的代码会遇到std::bad_alloc,但上述原因似乎都不适用。数据结构是一个存储为顶点std::list的图,其中每个顶点再次存储一个std::list的边,它是其中的一部分以及一些连续的数据。对于小图(由于在较大的block中分配更多内存时没有问题,因此应排除上述原因1.和2.。在某些部分,我们以一种非常容易出错的方式使用指针,因此我们可能会破坏堆数据结构。但是当在较小的实例上运行时,valgrind的memcheck报告我

c++ - 我可以始终使用 std::inserter(container, container.end()) 而不是 std::back_inserter(container) 吗?

std::back_inserter仅适用于带有push_back的容器,因此它不适用于set和map另一方面,std::inserter适用于所有容器类型。那么我可以一直使用std::inserter(container,container.end())吗?那么下面的代码是否适用于所有类型的容器?templateTContainercreate(TElementelement){TContainercontainer;autoinserter=std::inserter(container,container.end());for(inti=0;i>(1);create>(1);

c++ - 在新版本的 gcc 上返回隐式不可复制结构的 std::map 时出现编译错误

我在新版本的gcc(4.9+)上遇到了这个奇怪的编译错误。代码如下:#include#include#include#include#includeusingnamespacestd;structptrwrap{unique_ptrfoo;};templatestructholder{holder()=default;holder(constholder&b):t(b.t){}holder(holder&&b):t(std::move(b.t)){}holder&operator=(constholder&h){t=h.t;return*this;}holder&operator=(h

c++ - 在 std::map 中查找具有给定前缀的键或在 std::set 中查找元素的优雅方法

我有map,其中的键是std::string。我想在map中找到那些以"DUPA/"前缀开头的元素。找到下界很容易,但上界有点问题。我写了这样一段代码:constchar*prefix="DUPA/";constchar*firstAfterPrefix="DUPA0";autoprefixedBeginIt=myMap.upper_bound(prefix);autoprefixedEndIt=myMap.lower_bound(firstAfterPrefix);代码工作正常,但我认为它不够优雅,因为必须知道0在ASCII表中位于/的第一个。第二种方法是复制前缀并增加最后一个符号。

c++ - 使用 std::async 控制并行度

有没有办法显式设置/限制std::async和相关类使用的并行度(=独立线程数)?Perusingthethreadsupportlibrary没有发现任何有希望的东西。据我所知,std::async实现(通常?)在内部使用线程池。是否有标准化的API来控制它?对于背景:我在一个设置(共享集群)中,我必须手动限制使用的内核数量。如果我没有做到这一点,负载共享调度程序就会出现问题,我就会受到惩罚。特别是,std::thread::hardware_concurrency()没有任何有用的信息,因为物理内核的数量与我所受的约束无关。这是一段相关的代码(在具有并行性TS的C++17中,可能会

c++ - 将函数应用于元组的每个元素

给定一个类似于std::tuple的对象(即具有定义的tuple_size和get语义)和一个一元仿函数对象ftor,我希望能够在类似tuple的对象的每个元素上调用ftor。如果我忽略返回值,我知道int数组技巧:namespacedetails{templatevoidapply_unary(Ftor&&ftor,Tuple&&tuple,std::index_sequence){usingstd::get;intarr[]={(ftor(get(std::forward(tuple))),void(),0)...};}}//namespacedetailstemplatevoid