草庐IT

c++ - 容器使用的内部类型的内存分配

C++11标准在一般容器要求中有以下几行。(23.2.1-3)Forthecomponentsaffectedbythissubclausethatdeclareanallocator_type,objectsstoredinthesecomponentsshallbeconstructedusingtheallocator_traits::constructfunctionanddestroyedusingtheallocator_traits::destroyfunction(20.6.8.2).Thesefunctionsarecalledonlyforthecontainer’

c++ - 不使用 odr 的数组计数?

有几个很好的理由去选择#includetemplateconstexprstd::size_tARRAY_COUNT_FUNC(T(&arr)[N]){returnN;}而不是#defineARRAY_COUNT_MACRO(arr)(sizeof(arr)/sizeof(*arr))一个重要的区别是,当一个指针(不是数组)被传递给ARRAY_COUNT_MACRO时,它会默默地返回一个无用的答案,但是将相同的参数传递给ARRAY_COUNT_FUNC会导致编译错误指出错误。但是宏确实有一个优点:它的参数是未计算的。#includestructS{intmember_array[5];

c++ - Back_inserter 或 push_back

只是一个简单的问题-将字符串添加到vector的末尾哪个更好?,back_inserter或push_back?主要是,哪个工作得更快(我正在处理大量数据,所以边际差异实际上很重要),主要差异是什么? 最佳答案 两者并不等价。您使用std::back_inserter例如,当您需要将输入迭代器传递给算法时。std::vector::push_back在这种情况下不是一个选择。例如std::vectora(100,"Hello,World");std::vectorb;std::copy(a.begin(),a.end(),std::

c++ - 从 std::map 插入/删除元素是否会修改迭代序列?

假设我有以下代码:typedefstd::map::iteratorIterator;Iteratoriter=myMap.begin();while(iter!=myMap.end()){Iteratorcurrent=iter;++iter;maybeDeleteElement(current)//maycallerase.}鉴于std::map是作为红黑树实现的,能否保证映射中的每个元素都恰好被访问一次?还是修改map会导致树重新平衡,从而改变迭代顺序?注意:这不是关于任何迭代器是否会失效的问题。但是保持有效的迭代器并不一定意味着递增它会为您提供与之前相同的下一个元素。

c++ - 检查 std::function 是否分配给 nullptr

我想知道是否有任何方法可以检查您分配给std::function的函数指针是否为nullptr。我期待!运算符来执行此操作,但它似乎仅在为函数分配了nullptr_t类型的内容时才起作用。typedefint(*initModuleProc)(int);initModuleProcpProc=nullptr;std::functionm_pInit;m_pInit=pProc;std::cout我编写了这个辅助函数来暂时解决这个问题。templatevoidAssignToFunction(std::function&func,T*value){if(value==nullptr){f

c++ - binary_search 与 std::pair 使用自定义运算符

我正在尝试进行binary_search,包括一个整数对vector和一个整数,如下所示:#include#includeusingnamespacestd;typedefvector>int_pairs;booloperator&r){returnr.first(1,2));pairs_vec.push_back(pair(2,2));size_ti(2);binary_search(pairs_vec.begin(),pairs_vec.end(),i);}编译器告诉我operator未定义:erreur:nomatchfor‘operator’)我的做法是否正确?我尝试以多种不同

c++ - 使用 std::cin 忽略/跳过标记

使用scanf可以跳过匹配的标记,只需将*添加到模式中,如:intfirst,second;scanf("%d%*s%d",&first,&second);是否有与std::cin等效的方法?类似的东西(当然,不使用额外的变量):intfirst,second;std::cin>>first>>`std::skip`>>second; 最佳答案 C++中的输入流做同样的事情并不是一项简单的任务。函数scanf获取所有预期格式:"%d%*s%d"并且可以向前看以确定发生了什么。另一方面,operator>>>只是试图满足当前入口参数。

C++ std::vector<bool> 使用 drmemory 给出未初始化的读取错误

我在我的项目中使用了STL容器,我发现了一个我无法解释的奇怪错误。让我们考虑以下代码:#include#includeintmain(intargc,char**argv){std::vectorvec;vec.resize(5,false);std::cout这按预期输出0,但如果我使用drmemory运行内存检查,它会发现未初始化的读取。有人可以帮助理解这种行为吗?平台:win32;编译器:mingw32-gcc4.7.2;Drmemory1.6.0-构建2 最佳答案 std::vector是一个奇怪的小东西,使用位来实现它的目

c++ - 交换引用的临时元组

我正在编写一个自定义迭代器,它在取消引用时返回一个引用元组。由于元组本身是短暂的,我认为我无法从operator*()返回引用。我认为我的迭代器在语义上是有意义的,因为它具有引用语义,即使operator*返回一个值也是如此。问题是,当我尝试调用std::swap时(或者更确切地说,当std::sort调用时),如下所示,我收到错误,因为交换需要左值。有解决此问题的简单方法吗?#includeclasstest{public:test():v1(10),v2(10){}classiterator{public:iterator(std::vector&_v1,std::vector&_

C++ std::system_error 与 common catch std::exception block 的用法

std::system_error处理带有相关错误代码的异常。是否可以使用公共(public)catchblock来获取std::system_error异常消息及其代码?像这样try{//codegeneratingexception}catch(conststd::exception&ex){//catchallstd::exceptionbasedexceptionslogger.log()唯一的方法是直接捕获std::system_error类型并在捕获基本异常类型之前获取其代码吗?广泛使用std::system_error的最佳方法是什么? 最佳答