草庐IT

new_list

全部标签

c++ - 如何使用 std::forward_list 在恒定时间内进行范围拼接?

我想拼接范围[first,last],包括两个端点。我有元素beforefirst和last的迭代器。我可以使用splice_after()来完成,但只能在线性时间内完成。我相信这个拼接可以在恒定时间内完成。我如何使用std::forward_list完成它?如果问题不清楚,这里是显示我的问题的示例代码:LiveWorkSpace上的代码#include#include#include#includeusingnamespacestd;intmain(){forward_listtrg{'a','b','c'};forward_listsrc{'1','2','3','4'};auto

c++ - 如何从 std::list 实现 O(1) 删除

问题是使用std::list实现O(1)列表项删除的推荐方法是什么?通常,当我选择一个双向链表时,我希望能够在O(1)时间内从一个列表中删除一个元素,然后在O(1)时间内将它移动到另一个列表中。如果该元素有自己的prev和next指针,那么就没有真正的技巧来完成这项工作。如果列表是双向链接的循环列表,则删除不一定需要知道包含该项目的列表。根据Iteratorinvalidationrules,std::list迭代器非常耐用。因此,在我看来,在我自己的项目上使用std::list时,我想要得到的行为是在我的类和包含列表中存储一个迭代器。classItem{typedefstd::sha

如何检查角色是否是Rust中的Unicode New-Line字符(不仅是ASCII)?

每种编程语言都有自己的解释\n和\r。Unicode支持多个字符能够代表一条新线。从生锈的参考:空格逃脱是u+006e(n),u+0072(r)或u+0074(t)的字符之一,表示Unicode值U+000A(LF),U+000D(CR)或U+0009(HT)。基于该陈述,我会说如果它是一个新线角色,则是一个新的字符\n或者\r。在窗户上可能是\r和\n。我不确定。那以下呢?下一行字符(u+0085)线分离器字符(U+2028)段落分隔符(U+2029)我认为,我们缺少像char.is_new_line()。我看了看Unicode字符类别但找不到新线的定义。我是否必须提出自己对Unicode新

C++ 使用 "new"创建静态类数组或创建动态数组的另一种方法

我知道在C++中使用new创建动态数组的常用技术是:int*arr=newint[5];一本书还说:shorttell[10];//tellisanarrayof20bytescout现在我想知道是否有一种方法可以使用new为数组分配内存,这样它就可以分配给指向整个数组的指针。它可能看起来像这样:int(*p)[5]=newint[5];上面的例子是行不通的。左边在我看来是正确的。但是我不知道右边应该是什么。我的意图是了解这是否可能。我知道有std::vector和std::array。更新:这是我真正想检查的内容:int(*p1)[5]=(int(*)[5])newint[5];//

c++ - 我应该如何将 placement new 与自定义分配 API 一起使用?

我正在处理一些具有自定义分配和删除的内存空间,这些内存空间是使用类似malloc的接口(interface)创建的,不受我的控制(即不透明的C风格函数,用于“分配n个字节”或“释放一个字节”分配的指针”)。所以,没有什么比new或delete更好的了。现在,我想构造一个T的数组。我通过autospace_ptr=custom_alloc(n*sizeof(T))获得了空间。现在我想做一些类似array-placement-new的事情来就地构造n元素。我该怎么做?...或者我应该从1循环到n并构建单个T?注意:我在这里忽略对齐问题(或者更确切地说,假设alignof(T)划分sizeo

c++ - 从括号内的 initializer_list 构造时调用了错误的重载

我一直认为当我使用初始化列表C++语法时:something({...});编译器总是很清楚我想调用采用std::initializer_list的重载,但对于MSVC2015似乎不太清楚。我测试了这个简单的代码:#include#includenamespacetesting{templatestructTest{Test(){printf("Test::Test()\n");}explicitTest(size_tcount){printf("Test::Test(int)\n");}Test(std::initializer_listinit){printf("Test::Tes

c++ - 带有 nothrow 选项的 Operator new 仍然抛出异常

有这样的代码:#includeintmain(){for(;;){int*ptr=new(std::nothrow)int;if(ptr==0){std::cout然而,这个程序仍然抛出std::bac_alloc异常,尽管new是用std::nothrow参数调用的。该程序在VisualC++2010中编译,为什么会抛出异常?编辑:在Windows上从mingw使用g++,一切正常。 最佳答案 0必须格式化为"0"。这将占用几个字节;我敢打赌这就是原因。在std::bad_alloc::bad_alloc上放置一个断点,你就会知道

c++ - 运算符== 和 list::remove()

测试.h#ifndefTEST_H#defineTEST_H#includetemplatebooloperator==(conststd::weak_ptr&wp1,conststd::weak_ptr&wp2){std::shared_ptrsp1;if(!wp1.expired())sp1=wp1.lock();std::shared_ptrsp2;if(!wp2.expired())sp2=wp2.lock();returnsp1==sp2;}#endif测试.cpp#include"Test.h"#includeintmain(){typedefstd::list>intLi

c++ - 如何在 Qt 5 中将 New-Signal-Slot 语法声明为函数的参数

如何将信号或槽(成员函数,Qt5中的新语法)作为参数传递给函数,然后调用connect?例如我想编写一个等待信号的函数。注意:它不是编译-PointerToMemberFunction是我的问题。boolwaitForSignal(constQObject*sender,PointerToMemberFunction???signal,inttimeOut=5000/*ms*/){if(sender==nullptr)returntrue;boolisTimeOut=false;QEventLooploop;QTimertimer;timer.setSingleShot(true);Q

c++ - 在这个简单的例子中安全地调用 new 的最佳方法是什么?

对于一个学校项目,我有3个类:鸡蛋、巢和母鸡。我们需要使用new在main中创建每个的实例,对每个调用display(),然后显式删除每个。这很容易。我的问题是不知道如何正确地捕获bad_alloc;应该在任何new调用中抛出1。现在,它看起来像这样:intmain(intargc,char*argv[]){usingnamespacestd;coutdisplay();nest->display();hen->display();cout我想将整个block从第一个new到最后一个delete包装在一个tryblock中,然后只捕获一个bad_alloc,并在每个实例上调用delet