草庐IT

std-ranges

全部标签

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++ 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的最佳方法是什么? 最佳答

c++ - 为什么 std::vector::insert 复杂度是线性的(而不是恒定的)?

假设我在std::vector中的第'i'个位置插入p个新元素|大小为“n”。自std::vector中的项目保证为其元素使用连续的存储位置,这似乎需要我执行上述4个步骤:1)如果空间不足,可能会重新分配vector,基本上是将其大小加倍。但这是一个恒定时间操作(尽管非常大)。2)接下来是从索引0到i-1的元素从旧vector到新vector的memcpy。3)然后你复制'p'个新项目被插入到第i个索引处。4)然后是从旧vector到新vector的从i+1到n索引的所有项目的另一个memcpy。以上不都是常数时间操作吗?那么插入本身不应该是一个恒定时间的操作吗?为什么是std::ve

c++ - std::vector::erase() 是否在删除点使迭代器无效?

C++03标准§23.2.4.3/3描述了std::vector::erase(iteratorposition)并具体说明了Invalidatesalltheiteratorsandreferencesafterthepointoftheerase.在删除点的迭代器是否失效?具体来说,如果我有一个包含单个元素的vector,我将begin()迭代器复制到局部变量中,然后调用vec.erase(vec.begin())我在局部变量中的迭代器是否会失效?迭代器是在删除点之后还是在删除点之后失效? 最佳答案 我想说的是,您删除vecto

c++ - 为什么 GCC 中 std::list O(n) 的 size() 方法?

在GCC中,std::list的size()方法是O(n)。为什么?对于C++11,标准是size()oflistshouldbeO(1)但是在glibc中我们有以下内容:/usr/include/c++/4.6.3/bits/stl_list.htemplate>classlist:protected_List_base{...size_typesize()const{returnstd::distance(begin(),end());}问题是:为什么三年前的要求还没有在GCC中实现?编辑:gcc5改变了这一点:尽管以ABI改变为代价;这意味着使用gcc5.0编译的C++代码将无法

c++ - 使用 std::ostream 作为打印函数的参数

我一直使用cout来打印语句,但现在我想通过passingthestream来学习打印,比如voidprint(std::ostream&)const;我当前的打印函数看起来像templatevoidMystack::print(){for(inti=0;i我有两个问题:从我上面实现的普通打印功能切换到使用ostream的打印功能有什么好处。如何在我的函数中实现ostream。我试图从互联网资源中理解ostream但无法理解。请帮忙。完整运行代码如下://*************STACKCODE***************////VERYGOODEXAMPLETOUNDERSTA