草庐IT

c++ - std::vector 的复制构造函数如何操作?

std::vector是如何运作的?调用以下代码时初始化自身std::vectororiginal;std::vectornewVector=original;似乎复制构造函数会在std::vectornew上被调用。在newVector=original期间,但是std::string怎么样?在orginal里面带过来?它们是拷贝还是新的std::string的?newVector[0]中的内存也是如此与original[0]相同.我问的原因是说我做了以下事情#include#includeusingnamespacestd;vectorglobalVector;voidInitia

c++ - 为什么 std::to_string 没有短重载?为什么没有 noexcept?

有人知道为什么C++11标准第21.5节中声明的各种to_string函数缺少short和unsignedshort的重载吗?为什么不声明这些函数noexcept呢?这是完整的重载集:stringto_string(intval);stringto_string(unsignedval);stringto_string(longval);stringto_string(unsignedlongval);stringto_string(longlongval);stringto_string(unsignedlonglongval);stringto_string(floatval);s

c++ - 使用 std::dynamic_pointer_cast 向上转换 std::shared_ptr

我开始在C++0X/11中使用智能指针,但遇到了一个特殊情况。我想使用shared_ptr向上转换一个对象的实例。Extend类继承自Base类,其中Base类具有虚拟析构函数以使其具有多态性(否则dynamic_pointer_cast会提示非多态类转换)。如果因此:std::shared_ptrobj=std::make_shared();然后我做:obj=std::dynamic_pointer_cast(obj);安全吗?其他指向该对象的指针会怎样?是否只有obj将其视为Extend,而其他共享指针仍将其视为Base?向上转换同一实例是否安全,还是我应该做其他事情?编辑:感谢您

c++ - 如何在迭代时从 std::set 中删除元素

如何在迭代时从std::set中删除元素我的第一次尝试是这样的:sets;for(set::iteratoriter=s.begin();iter!=s.end();++iter){//Dosomestuffif(/*somecondition*/)s.erase(iter--);}但是如果我们想从集合中删除第一个元素,这是有问题的,因为iter--会使迭代器无效。执行此操作的标准方法是什么? 最佳答案 标准的方法是做类似的事情for(set::iteratoriter=s.begin();iter!=s.end();){if(/*

c++ - std::shared_ptr - 将共享指针作为参数传递的最佳实践

我已经离开严肃的C++大约十年了。我又回来了,目前正在从事一个项目,以完全熟悉C++11。关于如何最好地传递std::shared_ptr,我遇到了一些生存危机。举个简单的例子,采用以下设置:classServiceB{public:ServiceB(){}};classServiceA{public:ServiceA(std::shared_ptr&serviceB):_serviceB(serviceB){}private:std::shared_ptr_serviceB;};classRoot{public:Root():_serviceB(std::shared_ptr(new

c++ - 是否有请求 std::set 容量的函数?

对于std::vector,我们可以使用vector::reserve(n)来请求vector容量至少足以包含n个元素。那么std::set呢?我们是否有类似的功能来保留它的能力?我问这个问题是因为有时候当std::set变量用作函数的引用参数时,要求分配足够的能力,它来自另一个动态库(使用多线程调试(/MTd)).编辑一种可能的解决方案可能是使用get_allocator函数:std::setabc;float*p;p=abc.get_allocator().allocate(100);for(inti=0;i::iteratorit=abc.begin();std::set::it

c++ - 如何使用 `std::function` 作为函数参数创建可变参数模板函数?

如何使用std::function创建一个可变参数模板函数作为接受可变数量参数的函数参数?我试图将问题减少到MWE:#includetemplatevoidrun(std::functionfun,T*obj){fun(obj);}templatevoidrun_variadic(std::functionfun,T*obj,Args...args){fun(obj,args...);}structFoo{voidbar(){}};intmain(){Foofoo;std::functionfun=&Foo::bar;run(fun,&foo);//worksrun(&Foo::bar

c++ - std::ref 在此函数中有什么用?

为什么人们更喜欢调用std::ref而不是根本不调用它?templateFfor_each_arg(Ff,Ts&&...a){return(void)initializer_list{(ref(f)((Ts&&)a),0)...},f;//whynotreturn(void)initializer_list{(f((Ts&&)a),0)...},f;} 最佳答案 std::reference_wrapper::operator()在某些情况下,执行一些超出直接函数调用的“魔法”。其效果指定为(引用N4296[refwrap.invo

c++ - 如何专门化 std::begin?

我正在尝试为自定义容器专门化std::begin。我这样做是因为我想对容器使用基于范围的for。这是我的:classstackiterator{…};classstack{…};#includetemplatestackiteratorstd::begin(stack&S){returnS.GetBottom();}我在begin特化的定义中遇到以下错误:Nofunctiontemplatematchesfunctiontemplatespecialization'begin'我做错了什么? 最佳答案 I'mtryingtospec

c++ - std::apply 和常量表达式?

我在Wandbox中尝试了以下代码:#include#include#include#include#include#includeintmain(){constexprstd::arraystr{"123456789"};constexprautofoo=std::apply([](auto...args)constexpr{std::integer_sequence{};},str);std::cout编译器告诉我args...不是常量表达式。怎么了? 最佳答案 函数参数不能被标记为constexpr。因此,您不能在需要常量表达