草庐IT

c++ - std::function 和 std::bind 行为

我有这个代码:#include#include#includevoidfun(){std::cout>vec;vec.push_back(std::bind(fun));vec.push_back(gun);vec[0](1);vec[1](2);}您能解释一下std::bind是如何实现的吗?返回std::function绑定(bind)时void()功能?如何调用void()使用void(int)的功能仿函数? 最佳答案 作为function的模板参数传递的签名仅确定将绑定(bind)多少个占位符(_1)以及类型。实际函数的调用

c++ - 如何在 O(logn) 中查找 STL 中元素的等级

我想在STL集中查找元素的等级。我能够从头遍历到那个元素并找出它的等级,但这需要O(n)。有什么方法可以在O(logn)中找到排名。 最佳答案 没有;平衡树不需要存储每个节点的后代数量,这需要更快地计算distance(s.begin(),iter)forstd::sets和迭代器iter(我猜你是这个意思)。因此,除非通过一项一项地计算,否则信息根本不存在。如果您需要执行许多此类计算,请将set复制到已排序的随机访问序列中,例如vector或deque,但随后修改序列变得昂贵。做你所要求的事情的树数据结构可能存在于某处的免费图书馆

C++ 根据两个数据成员对对象进行排序

我知道您可以将用户定义的类插入到std::vector中然后重载排序机制,以便它在特定数据成员上进行比较。但是,您将如何对std::vector进行排序?其中MyClass有两个数据成员并且您想在第二个数据成员上添加“第二级”排序?所以对数据成员a进行排序在哪里a相等,则按数据成员b排序? 最佳答案 使用std::tuple创建自定义比较器#include//..structcomp{booloperator()(constMyClass&lhs,constMyClass&rhs)const{returnstd::tie(lhs.a

c++ - STL 中的 Binary_search set over set 的成员函数 find?

为什么我们有上述两种方式来搜索集合中的元素?也可以使用查找算法来查找列表或vector中的元素,但是这些提供成员函数以及成员函数预期比通用算法更快的危害是什么?为什么我们需要删除算法并创建所有关于删除删除的戏剧,其中删除只会移动元素然后使用删除删除实际元素..就像STL列表提供了一个成员函数删除为什么其他容器不能只是提供删除功能并完成它? 最佳答案 Binary_searchinSTLsetoverset'smemberfunctionfind?Whydowehave2wayslikeabovetosearchforanelemen

【C++】STL 算法 - transform 变换算法 ② ( 变换规则为 普通函数 | 变换规则为 Lambda 表达式 | 变换规则为 函数对象 | 变换规则为 函数适配器转换的函数对象 )

文章目录一、transform算法1、接收一个输入容器范围的transform算法函数原型2、代码示例-传入接受一个参数的普通函数3、代码示例-传入接受一个参数的Lambda表达式4、代码示例-传入接受一个一元函数对象作为变换规则5、代码示例-传入接受一个STL中预定义的一元函数对象作为变换规则6、代码示例-传入接受一个使用函数适配器将预定义二元函数对象转成的一元函数对象7、代码示例-将变换结果输出到标准输出流中一、transform算法1、接收一个输入容器范围的transform算法函数原型transform算法函数原型:下面的函数原型作用是将一个输入容器中的元素变换后存储到输出容器中;te

c++ - 当我们在 vector 上使用 unique 函数时,移位是如何工作的?

所以,我目前正在阅读一些c++的东西,我在cppreference上看到了这个例子,但我不明白转变是如何工作的。#include#include#includeintmain(){std::vectorv{1,2,2,2,3,3,2,2,1};std::vector::iteratorlast;last=std::unique(v.begin(),v.end());//123213221//^for(std::vector::iteratorit=v.begin();it!=last;++it){std::cout我知道当我们使用unique时它会改变事情,但是我不确定我们如何获得从l

c++ - 如何将 std::ofstream 重定向到 std::cout?

我正在处理一些使用std::ofstream*类型的全局调试记录器的代码。我想将它重定向到std::cout,因为我正在实时使用代码,而不是为它设计的批处理方法。是否可以将它使用的全局std::ofstream*指针重定向到std::cout?我知道std::ofstream继承自std::ios,它允许使用rdbuf()方法更改流缓冲区,但是不幸的是,std::ofstream重新定义了rdbuf()方法,这使得以下代码无法编译:gOsTrace=newstd::ofstream();gOsTrace->rdbuf(std::cout.rdbuf());是否有另一种方法可以将gOsT

c++ - 使用不同类型容器的迭代器范围初始化容器

假设我们有std::set我们想创建一个std::vector使用该集合中的所有值:std::setset;std::vectorvec(set.begin(),set.end());这简单而优雅。但是假设我有一个std::map我想将所有值复制到std::vector.不幸的是,没有接受迭代器和转换器函数范围的构造函数。为什么没有提供这样的构造函数?有没有另一种简单而优雅的方法来初始化具有不同类型值的容器? 最佳答案 使用变换迭代器:#include#include#includeintmain(){std::mapm;autof

c++ - 阅读 Effective、More Effective 和 Effective Modern C++(和 STL)的首选顺序是什么?

关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭6年前。Improvethisquestion我知道MoreEffectiveC++是EffectiveC++的扩展,而EffectiveModernC++侧重于C++11和14。作为这门语言的新手并且刚开始阅读这些书籍,我应该在之后阅读EffectiveModern前两个?另外,EffectiveSTL应该放在哪里?阅读上述书籍的首选顺序是什么,因为每本书都建立在前几本书的内容之上?(假设里面的一切对我来说都是新的?)此外,Effe

c++ - 如何创建一个 std::set 结构?

我需要创建一个STL::set结构。因此,我写了以下内容:stl::setmySet;//Point-nameofthestructure.然后我尝试将结构实例添加到mySet,如下所示:PointmyPoint;mySet.insert(myPoint);但是,我遇到了几个编译错误(错误C2784、错误C2676):1>C:\ProgramFiles(x86)\MicrosoftVisualStudio10.0\VC\include\xfunctional(125):errorC2784:boolstd::operator&,conststd::vector&):failedtobr