草庐IT

has_insertion_operator

全部标签

c++ - std::vector::assign/std::vector::operator=(const&) 是否保证重用 `this` 中的缓冲区?

如果我将一个vector分配或复制到另一个vector(其容量与前者的大小相同或更大),我可以假设后者的缓冲区将被重用吗?下面的例子证明我可以,但是,标准保证吗?std::vector::assign和std::vector::operator=在这方面的行为有什么不同吗?#include#include#includeintmain(){std::vectora{1,2,3,4,5};std::vectorb{1,2,3,4};std::vectorc{1,2,3,4,5,6,7,8,9,10};std::coutLiveexample.更新:Thisanswer提到voidassi

c++ - std::vector insert() 重新分配

我查看了std::vector代码,发现了一些我不太明白的东西。当capacity分配新缓冲区复制旧缓冲区的前缀(0-插入索引)在新缓冲区中构造新元素复制旧缓冲区的后缀(index-end)对旧缓冲区中的所有项目调用析构函数释放旧缓冲区据我所知,前缀和后缀的复制是用memmove完成的。memmove不是数据的纯二进制拷贝吗?它不会调用元素的构造函数,是吗?我想知道的是,如果内存只是移动,而不是在新缓冲区中重新构造,为什么函数会调用旧缓冲区中元素的析构函数? 最佳答案 我查看了MSVC8vector实现-我看不到memmove().

c++ - C1001 : An internal error has occurred in the compiler

这应该是不言自明的。我正在尝试实现分布排序,但MSVC编译器崩溃了。这似乎是用我的SFINAE检测成员函数的特定情况,如果我不将indexert传递给函数,或者替换has_get_index,这似乎不会发生。如果我删除剩余的索引器重载中的任何一个,它也不会发生。如果sortable有一个getIndex()const成员,问题仍然存在。1>test.cpp(34):fatalerrorC1001:Aninternalerrorhasoccurredinthecompiler.1>(compilerfile'msc1.cpp',line1420)1>Toworkaroundthispro

c++ - QMap/QHash operator[] 返回引用有效性

我想知道对Qt容器内的值的引用,尤其是QHash或QMap的有效期有多长。我所说的有效是指在插入或删除其他元素后是否保证仍指向映射/哈希内的正确位置。让我们看下面的代码:QHashdict;//orQMapdict;dict.insert('a',1);int&val(dict['a']);dict.insert('b',2);val=3;//在最后一行设置值是否会正确地将与a关联的值更新为3或者它会导致段错误还是未定义(所以有时工作,其他时候出现段错误,这取决于是否必须在内部重组数据结构,例如调整哈希表数组的大小)。QMap和QHash的行为是否相同,或者一个有效而另一个无效?

c++ - 避免在复制构造函数和 operator= 中重复相同的代码

在C++中,当类包含动态分配的数据时,显式定义复制构造函数、operator=和析构函数通常是合理的。但是这些特殊方法的事件是重叠的。更具体地说,operator=通常首先进行一些破坏,然后进行类似于复制构造函数中的处理。我的问题是如何在不重复相同的代码行并且不需要处理器做不必要的工作(比如不必要的复制)的情况下以最好的方式编写它。我通常有两种帮助方法。一种用于build,一种用于破坏。第一个是从复制构造函数和operator=中调用的。第二个由析构函数和operator=使用。示例代码如下:templateclassMyClass{private://Datamembersintco

c++ - 不要临时调用 QString::operator[]()

我运行clazy在我的代码上并获得有关此类代码的警告:QCharvalue()const{if(hide_content_)return'\0';elsereturntext()[0];}text()有这样的签名QStringtext()const;警告是:warning:Don'tcallQString::operator[]()ontemporary[-Wclazy-detaching-temporary]returntext()[0];^但这是什么意思呢?临时QString对象是否有可能被销毁在调用operator[]之前? 最佳答案

C++ : has_trivial_X type traits

boost库,似乎是即将推出的C++0x标准,定义了各种类型特征模板,以区分具有平凡构造函数、复制构造函数、赋值或析构函数的对象与不具有平凡构造函数的对象。其最重要的用途之一是优化某些类型的算法,例如通过使用memcpy。但是,我不明白所有各种has_trivial_X模板之间真正的实际区别。C++标准只定义了我们在这里关注的两大类类型:POD和非POD。如果一个类型具有已定义的构造函数、复制构造函数、赋值运算符或析构函数,则该类型是非POD。换句话说,任何不是内置类型或内置类型的C结构的东西都不是POD。那么区分has_trivial_assign和has_trivial_const

c++ - vim + C++ : insert a uuid in a guard clause

我正在尝试自动化文件注释标题。我一直在尝试弄清楚如何使用vim的autocmd将uuidgen命令的结果插入到我的header中。在页眉中,存在占位符文本,如下所示:#ifndef_UUID_#define_UUID_//Codegoeshere!#endif//_UUID_在.vimrc中填充_UUID_的自动命令行是:autocmdbufnewfile*.hexe"1,$s/_UUID_/".r!uuidgen."/g"问题出在r!uuidgen下。如何将shell命令执行的结果作为文本插入到autocmd行中?或者在vi替换命令中? 最佳答案

c++ - std::map::insert(...) 中的段错误

我使用了搜索,但没有找到令我满意的答案...所以...这是一段代码://VoteContainer.htypedefuint32_torder_id_t;typedefintdriver_id_t;classVote{public:enumDriverVoteResponse{YES,NO,TIMEOUT};structDriverResponse{driver_id_tdriver_id;time_ttime;DriverVoteResponseresponse;};Vote():m_order_id(0),m_time_until(0){};Vote(order_id_tinOrd

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上放置一个断点,你就会知道