草庐IT

-std=gnu99

全部标签

c++ - 几个小 std::vectors 的连续内存分配?

我想找到一种方法来在连续的内存中存储多个std::vectors,每个不同但已知且相当小的大小。我意识到我可以编写自己的类,比如使用一个非常大的数组,并在更大的数组中将指针指向数组的每个子部分的开头,将其视为一个单独的实体,但似乎应该有一种更聪明的方法来做到这一点.有没有办法使用分配器,例如,创建连续的std::vectors?我不想重新发明轮子只是因为我想要这个正常的std::vectors的内存位置我什至不知道如何开始编码。我需要创建一个分配器,它接受一个指向内存的指针,在那里分配一个vector,然后以某种方式传回该vector末尾的地址,因此下一个std::vector的分配器

c++ - std::search on single-pass 范围

我想从std::istream中读取数据,直到找到特定的字符序列,即我想实现以下接口(interface):voidread_until(std::istream&is,std::string_viewneedle);使用std::istreambuf_iterator,我相信这相当于std::search在单遍迭代器上的组合。不幸的是,std::boyer_moore_searcher需要随机访问迭代器。是否有任何使用C++标准库(以及与sv的大小成比例的内存)的上述接口(interface)的任何简单实现,还是我必须自己编写代码? 最佳答案

c++ - 为什么 std::atomic 中的所有成员函数都带有和不带有 volatile?

我注意到std::atomic的大多数成员函数类型被声明了两次,一次是用volatile修饰符,一次没有(example))。我检查了G++标准库实现的源代码,发现它们都是完全相同的,例如,boolload(memory_order__m=memory_order_seq_cst)constnoexcept{return_M_base.load(__m);}boolload(memory_order__m=memory_order_seq_cst)constvolatilenoexcept{return_M_base.load(__m);}我找不到任何volatile的例子变体的行为不

c++ - 如何以内存高效的方式缩小以适应 std::vector?

我想“收缩以适应”std::vector,以将其容量减小到其确切大小,以便释放额外的内存。标准技巧似乎是描述的那个here:templatevoidshrink_capacity(std::vector&v){std::vector(v.begin(),v.end()).swap(v);}shrink-to-fit的全部意义在于节省内存,但是这种方法不是先创建一个深拷贝然后交换实例吗?所以在某些时候——当复制被构建时——内存使用量加倍了?如果是这样,是否有一种内存更友好的收缩适应方法?(在我的例子中,vector真的很大,我无法承受在任何时候都将原始文件和它的拷贝都放在内存中。)

c++ - 为什么 std::copy(从 istream 到 ostream)会引发 ios::failure 异常?

以下代码应将数据从wifstream复制到wcout。复制内容后,程序抛出ios::failure异常。#include#include#include#include#include#include#includeintmain(void){std::locale::global(std::locale(""));std::wifstreamis;is.exceptions(std::ios::failbit|std::ios::badbit);is.open("test.ts",std::ios::binary);is>>std::noskipws;std::istream_ite

c++ - 如何获得 std::regex 的所有可能匹配项

我想找到正则表达式的所有可能匹配项,这怎么可能?regexrx("(2|25)");strings="2225";for(sregex_iteratorit(s.begin(),s.end(),rx),end;it!=end;++it){coutposition()str()给出输出:0:21:22:25但找不到第三个2:2。我更喜欢使用正则表达式,因为O(n)同时搜索多个标记的复杂性。更新:也许将标记列表拆分为不可前缀的列表并创建多个正则表达式?例如:(2|4|25|45|251|455|267)=>(2|4),(25|45|267),(251|455)这会增加复杂度,比如O(nlo

c++ - 带 std::get 的 SFINAE constexpr

这是DetectingconstexprwithSFINAE的后续问题.我想检测元组的元素(或任何可以与std::get一起使用的元素)是否为constexpr。所以我写了以下类似于Xeo给出的助手:templatestructsfinae_true:std::true_type{};templateautocheck(constT&arg)->sfinae_true(arg),N)>;templatestd::false_typecheck(...);现在我的测试驱动程序代码:intmain(){constexprstd::tuplearg(4,5);typedefdecltype(

c++ - 为什么 std::function 构造函数或赋值之间存在差异?

std::function类型删除构造函数定义为:templatefunction(Ff);赋值运算符定义为:templatefunction&operator=(F&&f);(来源cppreference)为什么构造函数通过值获取f,而operator=通过转发引用获取f? 最佳答案 我只能猜测,但我猜这是因为它被添加到C++而右值引用和转发引用被添加到语言中。因此其API的某些部分获得了转发引用,而另一些则没有。有一个小优点:如果F的复制构造函数可以扔而移动不能,std::function(F)可以保证不抛出,而std::fun

c++ - 如何 move std::ostringstream 的底层字符串对象?

#include#includeusingnamespacestd;templatestringToString(constT&obj){ostringstreamoss;oss如何movestd::ostringstream的底层字符串对象? 最佳答案 标准说std::ostringstream::str()returnsacopy.避免这种复制的一种方法是实现另一个直接公开字符串缓冲区的std::streambuf派生类。Boost.IOStreams使这变得非常简单:#include#include#includenamesp

C++17 std::variant 头文件 (clang 6.0.0)

更新我将问题缩小到(可能!这还不完全清楚,甚至阅读了我能找到的关于该主题的所有内容)安装stdlibc++-7-dev会为我提供合适的(即C++17兼容)STLheader和库。这(同样,显然)与Ubuntu17.04(artful?)捆绑在一起,但不适用于xenial(Ubuntu16.04.3LTS),这就是我的我正在使用。我已经尝试下载单独的.deb包并安装它们,但它很快就会变成一个Unresolved依赖项的迷宫。如果有人能告诉我如何在16.04上安装libstdc++-7-dev,我将不胜感激。原始问题我刚刚通过包管理器(在theseinstructions之后)在Ubunt