草庐IT

c++ - 从 std::vector 打印逗号分隔列表

这个问题在这里已经有了答案:HowcanIprintalistofelementsseparatedbycommas?(33个答案)关闭2年前。我正在尝试打印std::vector中单个详细信息的逗号分隔列表.到目前为止,我见过的最简单、最聪明的方法是使用std::ostringstreamss;std::copy(vec.begin(),vec.end()-1,std::ostream_iterator(ss,","))ss当我打印一个字符串vector时,它工作得很好。但是,现在我正在尝试打印有关MyClass的单个详细信息.我知道在Python中我可以做类似的事情(x.speci

c++ - 为什么我不能将 boost::function 存储在 std::list 中?

我得到以下编译错误:error:expected`;'before'it'"这是我的代码:#include#includetemplatevoidexample(){std::list>::iteratorit;}为什么会这样?我该如何解决? 最佳答案 您需要将typename放在该行的前面,因为您执行::iterator的类型取决于模板参数T。像这样:templatevoidexample(){typenamestd::list>::iteratorit;}考虑这条线std::list>::iterator*it;这可能意味着乘法

c++ - union 成员可能没有构造函数,但是 `std::pair` 可以吗?

union成员可能没有析构函数或构造函数。所以我不能模板化以下类Foo靠我自己MyClass如果MyClass有一个构造函数:templatestructFoo{Tval;Foo(Tval_):val(val_){}size_thash()const{union{Tf;size_ts;}u={val};returnu.s;}};structMyClass{boola;doubleb;MyClass(boola_,doubleb_):a(a_),b(b_){}};如果我这样做,我会得到这个错误:member'MyClassFoo::hash()const[withT=MyClass]::

c++ - 迭代 std::vector 的面向对象的方法?

我有一个类,它有一个std::vector子控件指针。出于显而易见的原因,我不希望类的用户直接访问std::vector。我想要的只是一种为调用者提供指针的方法。什么是好的OO方法来做到这一点?(这个函数会经常被调用)谢谢 最佳答案 提供一个函数,返回一个const_iterator给vector。加一返回迭代器到vector的末尾也很有用。classMyClass{public:typedefvector::const_iteratorc_iter;c_itergetBegin()const{returnv.begin();}c_

c++ - std::is_const 将 const 指针标识为非常量

我很困惑std::is_const识别const的行为指针为非const.我自己的实现is_const做完全一样的事情。我不确定为什么更通用的模板化结构正在挑选版本。gcc4.7和clang3.1-svn表现出相同的行为。任何人都可以解释发生了什么事吗?代码如下:#include#include#includeclassCEmptyClass{};namespacejbc{templatestructis_const:std::false_type{};templatestructis_const:std::true_type{};}intmain(intargc,char*argv[

C++ 异常:为什么要使用或扩展 std::exception?

根据thissite抛出字符串或整数非常有用。我发现这非常干净且易于理解。throw"descriptionofwhathappened"而不是throwstd::runtime_error("descriptionofwhathappened")有什么缺点? 最佳答案 那个网站很愚蠢,教的是糟糕的设计。如果您抛出int或char*,那么您将不得不使用int或char*捕获它>只有。您可以使用const对其进行限定。如果您抛出std::runtime_error,那么您可以使用std::runtime_errorconst&或其基类

c++ - 在 std 命名空间中添加模板特化

背景:我试图回答这个问题Whyisn'tmyoverloading.我的建议之一(除了使用谓词之外)是移动自定义operator对于std::string在命名空间std中,以便编译器可以优先于模板化版本。答案以闪电般的速度被否决,一位知名用户发表了以下评论:Thisisundefinedbehaviour,youarenotallowedtoadddeclarationstonamespacestdbecauseitcanchangethebehaviourofthestandardlibrarycomponens我的问题:是否可以为STL类型添加模板特化,即使该特化的声明不包含用户

c++ - 如何在 C++11 lambda 中跟踪对象生命周期?

有时,我们对捕获对象状态的lambda的生命周期一无所知(例如,从对象返回它,将其注册为回调而无法取消订阅等)。如何确保lambda不会在调用时访问已销毁的对象?#include#include#includeclassFoo{public:Foo(conststd::string&i_name):name(i_name){}std::functionGetPrinter(){return[this](){std::coutf;{autofoo=std::make_shared("OK");f=foo->GetPrinter();}autofoo=std::make_shared("W

c++ - 部分排列

我有以下用于输出部分组合的递归函数:voidcomb(stringsofar,stringrest,intn){stringsubstring;if(n==0)cout这样调用:comb("","abcde",3);部分组合是指它使用n个选择和r个元素(而不是n个选择,n个元素)。但是,我想考虑元素的顺序(即排列)。我可以找到许多完整排列的算法,但不是部分排列。 最佳答案 是时候进行性能现实检查了。如果您只对一次访问5件事3的排列感兴趣,请立即停止阅读,因为访问次数太少以至于无关紧要(除非您可能正在这样做十亿次)。但是如果您需要访问

c++ - push_back 与 emplace_back 到 std::vector<std::string>

类似的问题存在于here和here但我认为我们还没有得到明确的答案然后我重新提出问题。C++11标准有两种在vector末尾添加新元素的方法,它们是std::vector::push_back和std::vector::emplace_back.它们之间的区别在于std::vector::emplace_back就地构造对象而std::vector::push_back基本上复制对象(或原语类型)或将其移动到vector的末尾。然后std::vector::push_back看起来是将原始类型添​​加到std::vector中的更好选择。例如:std::vectorvVec;vVec.