草庐IT

c++ - std::random_shuffle 产生相同的结果,即使 srand(time(0)) 被调用一次

在一个函数中,我想生成一个范围内的数字列表:(该函数只会在程序执行时被调用一次。)voidDataSet::finalize(doubletrainPercent,boolgenValidData){srand(time(0));printf("%d\n",rand());//indices={0,1,2,3,4,...,m_train.size()-1}vectorindices(m_train.size());for(size_ti=0;i结果是这样的:850577673246239710241201288231237几秒钟后:856981140246239710241201288

c++ - 如果声明了析构函数,为什么这段代码无法编译?

考虑以下C++11代码:#include#includestructA{A(){}//virtual~A()=default;//~A()=default;//~A(){};std::threadt;};intmain(){std::vectorv;v.emplace_back();}如果前面代码中声明析构函数的任何行未被注释,则此代码将无法编译。编译器提示std::thread的复制构造函数被删除。但是std::vector::emplace_back不应该使用复制构造函数,那么,为什么会失败呢?为什么提到析构函数很重要?GCC输出(~A(){};未注释):$g++--std=c++

c++ - 编译器如何知道必须调用 std::forward 函数的哪个重载?

以下签名被声明为std::forward重载:templateT&&forward(typenameremove_reference::type&arg)noexcept;templateT&&forward(typenameremove_reference::type&&arg)noexcept;现在,考虑以下模板函数:templateT&&foo_as_always(T&&t){returnstd::forward(t);}如果我写:inti=0;foo_as_always(i);然后这就是编译器如何使用T=int&实例化foo_as_always:int&foo_as_alway

c++ - clear() 是否影响 std::unordered_set 的桶计数?

有很多answers使用std::vector,但是std::unordered_set呢?我真正的问题(密切相关)是这样的;如果我事先保留我知道的合理大小,通过在每次使用前清除它来重用相同的无序集是否有效? 最佳答案 正式的回答是:这取决于实现。非正式的回答是:unordered_set里面有一个(某种)桶数组,而且很可能实现是和vector一致的,所以这个数组不会当clear()被调用时被删除。所以调用clear()很可能会带来一些好处。 关于c++-clear()是否影响std::

c++ - std::regex 中的错误?

代码如下:#include#include#includeintmain(){std::stringpattern("[^c]ei");pattern="[[:alpha:]]*"+pattern+"[[:alpha:]]*";std::regexr(pattern);std::smatchresults;std::stringtest_str="cei";if(std::regex_search(test_str,results,r))std::cout输出:cei使用的编译器是gcc4.9.1。我是学习正则表达式的新手。我预计不会输出任何内容,因为"cei"与此处的模式不匹配。我做

c++11:从模板函数构建 std::tuple

我有以下功能:templateTCheck(intindex);我如何编写函数CheckTuple,它在给定元组类型的情况下通过调用Check来填充元组?p>例如:CheckTuple>()将返回以下元组:std::make_tuple(Check(1),Check(2),Check(3))我看到的其他问题涉及解包一个给定的元组,而不是用这种方式构建一个元组。 最佳答案 使用C++14的integer_sequence实现您正在寻找的东西变得非常简单.如果您没有可用的,here'saC++11implementation由Jonat

c++ - 为什么 std::shared_ptr 没有 operator->*?

为什么std::shared_ptr没有operator->*?使用可变模板似乎很容易实现。参见thispaper了解更多信息。编辑:这似乎是以下内容的潜在重复:Aboutshared_ptrandpointertomemberoperator`->*`and`std::bind` 最佳答案 这可以在C++14之后添加到std::shared_ptr而不是您链接的复杂代码:templateautooperator->*(Method&&method){return[t=get(),m=std::forward(method)](au

c++ - std::function 到对象的成员函数和对象的生命周期

如果我有一个std::function的实例,它绑定(bind)到一个对象实例的成员函数,并且该对象实例超出范围,否则将被销毁,我的std::function对象现在被认为是一个坏指针,调用时会失败?例子:intmain(intargc,constchar*argv){type*instance=newtype();std::functionfunc=std::bind(type::func,instance);deleteinstance;func(0);//isthisaninvalidcall}标准中是否有规定应该发生什么?我的直觉是它会抛出异常,因为对象不再存在编辑:该标准是否

c++ - 如何将通用 packaged_tasks 存储在容器中?

我正在尝试采用std::async风格的“任务”并将其存储在容器中。我必须克服困难才能实现它,但我认为一定有更好的方法。std::vector>mTasks;templatestd::future::type(typenamestd::decay::type...)>::type>push(F&&f,Args&&...args){autofunc=std::make_shared::type(typenamestd::decay::type...)>::type()>>(std::bind(std::forward(f),std::forward(args)...));autofutu

带有函数指针的 C++ 模板回调

我想知道是否有可能在不抛出错误的情况下实现这样的目标:#includetemplateTSum(T_arg,T(*callbackFunction)(T)){Tresult=(*callbackFunction)(_arg);returnresult;}templateTCallback(T_arg){std::cout这是我得到的:cannotusefunctiontemplate'TCallback(T)'asafunctionargumentcouldnotdeducetemplateargumentfor'T'from'float' 最佳答案