草庐IT

back_emplace_iterator

全部标签

c++ - 移动到未初始化的内存,或者 raw_storage_iterator 是如何工作的

我想将一系列对象移动到未初始化的内存中(使用移动构造)。由于std::uninitialized_copy没有move-counterpart,我想到了两个选项:使用std::move和raw_storage_iterator,或求助于手动循环:T*dest=get_memory();//optiononestd::move(first,last,std::raw_storage_iterator(dest));//optiontwofor(autoi=first;i!=last;++i,++dest){new(dest)T(std::move(*i));}第一个选项会执行移动构造(因

c++ - 为什么 std::vector::push_back 需要赋值运算符

std::vector::push_back(constT&value)根据this要求类型T是CopyInsertable.但是,除非我提供公共(public)赋值运算符,否则使用失败(clang、GCC、Visual;均没有c++11)编译以下程序。#includeclassA{A&operator=(constA&rhs);//private!!};intmain(){std::vectorv;Aa;v.push_back(a);}为什么我需要提供这个赋值运算符,我的印象是复制构造就足够了。附言我在标准中找不到定义这个的地方,所以如果你能指出引用,我将不胜感激

c++ - map::emplace 在什么时候创建对象?

是std::map::emplace的点创建以某种方式在标准中指定的对象(即调用构造函数)?如果是,它是在检查此类key的存在之前发生的还是之后发生的?在以下情况下很重要:structX{};std::map>map;voidf(intx){map.emplace(x,newX);}如果object是先创建的,一切都很好(unique_ptr是构造出来的并拥有资源),但是如果是在check之后构造的,在重复key的情况下会出现内存泄漏。我在Standard中所能找到的就是Insertsavalue_typeobjecttconstructedwithstd::forward(args)

c++ - __mm128 的 vector 不会 push_back()

这个简单的SSE代码:#include#includeintmain(){std::vectorblah;blah.push_back(__m128());}在MSVC10上崩溃并在0xffffffff处出现段错误。可能出了什么问题? 最佳答案 std::vector不分配特殊对齐的内存,__m128需要用它来存储它的数据。您将不得不换出分配器,或者将其替换为4个float的数组,然后在每次访问vector时执行未对齐的加载或复制到对齐的位置。 关于c++-__mm128的vector不

c++ - std::ostream_iterator 未找到运算符<<

我已经声明了一个operator对于std::pair:std::ostream&operator&p){o我想在打印数据时使用这个运算符:std::vector>data;std::copy(data.begin(),data.end(),std::ostream_iterator>(std::cout,"\n"));但是编译器说,nomatchforoperator...我做错了什么? 最佳答案 std::copy找不到operator的重载对于std::pair在std命名空间。没有什么好办法,重载operator对于来自st

c++ - push_back() 之后 vector 的容量发生变化

有人可以解释为什么我没有得到相同的输出吗?ma​​in.cpp:#include#includeusingnamespacestd;structCell{vectorvtx;};intmain(){vectorcells;Celltmp;tmp.vtx.reserve(5);cells.push_back(tmp);cout输出:50 最佳答案 因为获取vectorA并将其复制到vectorB并不能保证vectorB与vector具有相同的容量>一个。通常,新vector只会分配足够的内存来容纳要复制到其中的元素。事实上,有一个古老

c++ - 为什么将 set::iterator 而不是 const_iterator 传递给函数会违反单一定义规则?

std::set的描述容器givenbycppreference.com最后包含此注释:Themembertypesiteratorandconst_iteratormaybealiasestothesametype.Sinceiteratorisconvertibletoconst_iterator,const_iteratorshouldbeusedinfunctionparameterliststoavoidviolationsoftheOneDefinitionRule.我不明白最后这句话。我的理解是一个集合不允许修改它的元素(如果你需要改变一个,你必须erase它然后inse

c++ - 运行时错误 : map/set iterators incompatible

我在第8行遇到运行时错误“map/setiteratorsincompatible”。voidManager::Simulate(Military*military,Shalishut*shalishut,char*args[]){Simulation*simulation=Simulation::GetInstance();Time*time=Time::GetInstance();multimap::iteratoritTasks;itTasks=simulation->GetTasks().begin();while(itTasks!=simulation->GetTasks()

c++ - 为什么 std::multimap 没有实现 try_emplace?

C++17引入了try_emplacestd::map的方法,所以现在我可以编写如下代码:structTest{Test(inti,intj){}};std::maptmap;tmap.try_emplace(10,10,10);但是没有try_emplace对于std::multimap,所以piecewise_construct仍然需要。这有技术原因吗? 最佳答案 isthereatechnicalreasonforthis?是的。try_emplace()的目的是如果键已经存在于映射中则不执行任何操作。但是对于std::{un

C++ STL vector : Push_back taking reference

从std::vector的cpp文档中,我看到了这一点:voidpush_back(constT&x);我知道push_back复制了我传递的对象。但是,为什么签名是constT&?通过查看这个,我最初认为它需要一个const引用我推送到vector. 最佳答案 另一种选择是voidpush_back(Tx);即按值取x。但是,这将(在C++03中)导致创建x的额外拷贝(push_back的参数中的拷贝)。通过const引用获取x可以避免这种情况。让我们看一下调用v.push_back(T())的堆栈:v.push_back(T()