草庐IT

STD_PROP_LIST

全部标签

c++ - std::list<bool> 的实现

是否std::list具有类似的疯狂,像std::vector这样的明确特化?是std::vector唯一受此影响的C++标准库容器?是否有某种traits我可以用来检测特化吗? 最佳答案 如标准所示,std::vector有它自己的段落来规定它的实现。std::list的要求有一个不存在,但这并不意味着不允许实现不但是有一个。据我所知,std::vector是唯一需要具有bool特化的容器. 关于c++-std::list的实现,我们在StackOverflow上找到一个类似的问题:

c++ - 删除元素后 std::string 容量保持不变,那么它是否占用了一些内存?

下面这段代码:stringa="abc";cout...输出:33即使我从字符串中删除一些元素,容量也保持不变。所以我的问题是:是否有一些内存因为容量问题而被占用?如果我没有明确地reserve()怎么办?如果我使用reserve()并且没有用完整个容量,我是不是在浪费内存?如果需要,这些额外的内存(我没有使用)是否会分配给其他东西?编辑:假设我有stringa="something";a="ab";现在我知道a永远不会超过两个字符。那么调用reserve(2)这样内存就不会被浪费是明智的吗? 最佳答案 我先回答你的问题:内存属于字

c++ - 将 lambda 转换为 std::function 时强制执行常量正确性

我有一个函数将std::function作为参数。但是,我想确保传入的函数不允许修改传递给它的参数。下面是该函数的简单版本(注意T可以而且通常是引用):templatevoidBar(std::function)>func){//...}错误用法:Bar([](int&){/*Donastystuff!*/});/*A-OK!*/我想禁止这种用法,但这段代码编译得非常好,即使我觉得它不应该。有趣的是,如果我去掉模板参数,即:voidBar(std::functionfunc){//...}那么,这个用法就不会编译(因为它不应该):Bar([](int&){/*Donastystuff!

c++ - 如何使用缓冲区正确读取已打开的 std::ifstream

背景我实现了一个JSON解析器并提供了一个operator>>函数来解析std::ifstream。为了加快读取速度,我将16KB复制到一个缓冲区中,然后让我的解析器从缓冲区中读取。一个小型基准测试表明,这比直接使用std::ifstream::get或std::ifstream::read更快。​​当前(错误?)实现当我成功读取一个JSON值时,我想将所有不需要的字节从缓冲区“放回”到流中,以便随后使用相同的std调用operator>>::istream在第一个调用结束的地方继续解析。我目前像这样实现这个“放回去”:is.clear();is.seekg(start_positio

c++ - C++ 代码 `x.erase(std::remove(x.begin(), x.end(), ' '), x.end())` 是如何工作的?

问题是我通常会使用for循环来处理这种事情,但这种方法似乎更有效率。cplusplus的文档对我来说有点难以理解。std::stringno_space(std::stringx){x.erase(std::remove(x.begin(),x.end(),''),x.end());returnx;} 最佳答案 函数std::remove(x.begin,x.end),'')将元素移动到字符串的末尾,函数std::erase实际上删除了被移动到字符串末尾的元素。您还可以在文档中阅读更多相关信息enterlinkdescription

C++ 枚举类 std::size_t 隐式转换

我通过创建一个枚举类定义了一个元组及其索引:/**parameter{key;value1;value1;}*/usingParameter=std::tuple;enumclassParameterKey:std::size_t{KEY=0,VALUE1=1,VALUE2=2};现在我想从这个元组中获取一个值:constauto&key=std::get(*parameterPointer);我认为从int到std::size_t的隐式转换是由:std::size_t语法确保的:enumclassParameterKey:std::size_t{....}但是我收到了这个错误erro

c++ - 相同的结果 qsort 与 std::sort

请原谅消息的简洁。我有一组记录。我想按w.r.t.降序排序。其中一个关键。记录的键不是唯一的。qsort的比较函数:intcmp(constrecord*rec1,constrecord*rec2){returnrec2->key-rec1->key;}std::sort的比较函数:booloperator()(constrecord&rec1,constrecord&rec2){returnrec1.key>rec2.key;}两个版本会给出相同的结果吗?我不确定当键相等时sort/qsort的行为是否相同。 最佳答案 没有这样的

c++ - std::lock 仍然导致死锁

std::lock是用来防止死锁的吧?但是在我的测试中,它仍然导致死锁。你能检查一下我的测试代码,看看我是否使用错误吗?std::mutexm1;std::mutexm2;voidfunc1(){std::unique_locklock1(m1,std::defer_lock);printf("func1lockm1\n");std::this_thread::sleep_for(std::chrono::seconds(2));std::unique_locklock2(m2,std::defer_lock);printf("func1lockm2\n");std::lock(m1,

c++ - va_list 还在 C++ 中使用吗?还是鼓励使用 template<typename...T>?

在C中,定义可变长度参数的唯一方法是使用省略号声明其原型(prototype)并使用va_list、va_start、va_arg,va_end来提取它们。就像printf系列和scanf系列一样。在C++11中,引入了如下新方法。templatevoidfunc(Targ,MoreT...args){//Dosomestufffunc(args);}每种方法的优点和缺点是什么?在C++中是不鼓励使用还是鼓励使用它们中的任何一个? 最佳答案 在C++中强烈不鼓励使用C风格的可变参数函数。风格各不相同,但编写这些类型的函数会让您在某些

c++ - 为什么在这个 'handmade list' 中使用指向指针的指针?

我们在学校有一个项目,尽管该项目是关于什么的,但它涉及使用具有这种特定结构的链表:typedefstruct_node{intcontents;_node*next_node;}*node;在项目之前,我们被分配了一堆函数来学习使用列表(将节点推到列表的前面或后面,计算节点数量,搜索特定节点等)。其实并没有那么难,但是当老师发来基础工程的时候(这样我们每个人都从同一个地方开始),所有的函数都涉及传递一个*node引用。例如:resultTypefunctionName(node*list,...){...}我在项目之前用void函数完成了所有列表函数,因为,至少据我所知,我们正在使用指