问题标签 [stl-algorithm]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 最后插入是否等同于 std::copy()?
考虑以下两种将元素附加到向量中的方法
std::copy
版本看起来更干净,我不必输入vi2
两次。但是由于它是一个通用算法,而 insert 是一个成员函数,它可以比它insert
执行得更好std::copy
还是做同样的事情?
我可以对自己进行基准测试,但我必须对每种模板类型的每个向量都进行基准测试。有人已经做过了吗?
stl-algorithm - 使用具有提升范围的变换算法
嗨,我正在尝试使用 boost.range 添加两个标准向量,但我得到了一堆错误。
这有效:
这不会:
有一个错误:
这也不是:
有一个错误:
c++ - Visual Studio 2008 中的错误? 包含算法似乎无意中在第 3795 行交换了迭代器的顺序
我试图让includes
算法在 a 上工作,set
并将map
地图的键与集合的值进行比较。需要规避的问题当然map<K,V>::value_type
是pair<K,V>
while set<V>::value_type
isV
所以这些不适用于默认值,默认值includes predicate<T>
期望两个参数具有相同的值类型。
因此,我正在编写以下谓词类来解决这个问题
然而,模板实例化器在 VS2008 xutility 文件的第 313 行抛出
带有无法将参数 1 从转换为的const V
消息const std::pair<_Ty1,_Ty2>
这似乎是由文件的第 3795 行引起的
其中第一个和第二个参数似乎已被交换 在发布配置中编译在第 3795 行给出了相同的错误,因此 Visual Studio 实现似乎希望您通过此代码,除非您修改任何开关(如果有)删除此' _DEBUG_LT_PRED' 宏。
我的问题是:这是 Visual Studio 中的一个错误,还是有这样的原因,我犯了一个错误?十多年来,我没有做过任何 C++,上周不得不重新开始,以便在一些紧凑的循环中加快速度,所以需要我能得到的所有帮助。
谢谢大家
好的,
我没有考虑算法的要求。有道理,它需要从双方检查“小于”。
虽然编译这个并没有得到太多的乐趣。
用我以前的代码
我得到
这是有道理的,因为没有 operator() 可以将 double 作为其第一个参数。
使用额外的重载 operator()
我现在得到
值得注意的是,所有错误似乎都与第 2 个错误有关operator()
,即K
第 1 个和P
第 2 个错误。是的,在那个操作符上,所提到的任何转换都不应该是可能的。但是为什么编译器不尝试另一个运算符呢?即应该允许这些转换的那个。(顺便说一句,错误会重复出现,因为如果您想知道它们每个都出现在两条不同的行上)
这可能是另一件事当然是 const 不正确。已经有一段时间了,所以我会尝试考虑一下。
谢谢您的帮助
2013 年 5 月 15 日编辑
我不得不“继续下去”,所以通过将我的地图键放入一个集合中来规避这个问题,这样我就可以includes
在两个集合上调用算法(导致明显的性能损失)。我仍然想正确解决这个问题。这是复制我用 Visual Studio 2008 描述的编译器错误所需的所有代码
编译器吐出来
单看第一个错误,它似乎想使用 operator()(KEY,PAIR) 来传递 PAIR,KEY。为什么它忽略了可用的 operator()(PAIR,KEY)??? 其他错误都是一样的,编译器“似乎”忽略了一个完美的重载运算符
谢谢大家的帮助
c++ - 在 std::sort 期间使用自定义比较器进行 std::out_of_range
我有以下代码
现在我有一个简单的排序代码,其中我根据另一个双精度向量对索引向量进行排序。'circle_fwd_vector' 是一个包含所有双精度的向量。
现在在控制台中,我得到这样的结果:
由于我没有使用任何自定义类,并且我正在排序的向量仅基于双打,所以我不确定为什么我会超出范围。我确保双向量中没有无穷大,但即使有,std::sort 不应该在不超出索引的情况下给我正确的排序索引吗?
感谢您的任何帮助。
编辑:如果有帮助,这是发生这种情况时向量的数据转储。 http://pastebin.com/7wLX63FJ另外,我正在使用 Xcode 3.2.6 附带的 GCC 4.2 进行编译。
c++ - std::remove 导致编译错误
我正在尝试使用问题的答案并得到奇怪的错误 -
/usr/include/c++/4.6/bits/stl_algo.h:162: 错误: '__first.__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* 与 _Iterator = User* 中的 'operator==' 不匹配, _Container = std::vector, __gnu_cxx::__normal_iterator<_Iterator, _Container>::reference = User& == __val'</p>
我正在使用 Linux(Ubuntu 64 位),也许这是个问题。提前致谢。
更新:我使用 remove() 的代码:
c++ - 算法函数:将其设为模板还是采用 std::function 参数?
我有一个名为 Graph 的 C++ 类,它有一个算法方法 for_each_node()。我可以将其设为模板,如下所示:
或者让它使用 std::function,像这样:
标准算法,例如 std::for_each,使用第一种方法,而一些库,例如 gtkmm(它是 GTK+ 的 C++ 绑定),将函数作为包含它们的对象的函数指针。
每个选项的优点和缺点是什么?我不确定该选择哪个。什么会影响选择:我的 Graph 类是否是类模板,或者算法方法需要使用多少不同的函数,或者速度要求?
c++ - 'typedef' 类型的数组上的 STL 复制失败
平台:MinGW64(rubenvb 4.7.2),Windows 7(64),Qt 4.8.2
给定代码段如下:
我不知道为什么编译器会抛出以下错误消息(从 'typedef long T_PSIZE;' 更改为 'typedef int T_PSIZE;' 时也会显示类似消息):
编译器的模板引擎似乎无法识别类型“long int”。我将类似的语句与“普通整数”数组一起使用,效果很好。我没有使用任何 STL 容器,因为我确切地知道目标数组的大小,所以我认为我不需要重新实现类似 back_inserter 的东西。我错过了什么吗?
注意:我不确定这样的问题是否有帮助。(或者我怎样才能获得语句的“完整”限定名称以处理 typedef ed 变量?)
c++ - 如何找到键大于 val 的地图的第一个元素
我有一个map<double,T>
(比如说T==string
),我想找到地图的第一个元素,使得键大于给定的数字。我查看<algorithm>
并找到了upper_bound和lower_bound。
奇怪的是,我可以使用lower_bound
但不是上面的第一个upper_bound
,我做错了什么?
c++ - 调用“查找”没有匹配的函数
我有以下代码:
我尝试在 Ubuntu 上使用 gcc 4.7.1 编译它并得到以下错误:
这段代码没有做任何事情,因为向量没有用任何内容初始化,但它应该编译。
我怀疑这是一个 gcc 问题,但经过大量挖掘后,我绝望了。如果有人遇到此问题并知道如何解决,请告诉我。
c++ - 为自定义类重载 std::find
那么std::find
对象中的自定义类是否有可能/“好”重载?然后不重载相等运算符。假设一个容器存储(智能)指向它的实际数据的指针,我真的对数据布局或存储模式不感兴趣,我只想找到某个数据成员....
这是否合法,“道德”?如果说我有一个std::vector<std::shared_ptr<myClass> >
- 或“甚至”用户定义的容器?还是我应该始终依赖std::find_if
此类情况?