问题标签 [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.

0 投票
4 回答
8102 浏览

c++ - 最后插入是否等同于 std::copy()?

考虑以下两种将元素附加到向量中的方法

std::copy版本看起来更干净,我不必输入vi2两次。但是由于它是一个通用算法,而 insert 是一个成员函数,它可以比它insert执行得更好std::copy还是做同样的事情?

我可以对自己进行基准测试,但我必须对每种模板类型的每个向量都进行基准测试。有人已经做过了吗?

0 投票
1 回答
1520 浏览

stl-algorithm - 使用具有提升范围的变换算法

嗨,我正在尝试使用 boost.range 添加两个标准向量,但我得到了一堆错误。

这有效:

这不会:

有一个错误:

这也不是:

有一个错误:

0 投票
1 回答
743 浏览

c++ - Visual Studio 2008 中的错误? 包含算法似乎无意中在第 3795 行交换了迭代器的顺序

我试图让includes算法在 a 上工作,set并将map地图的键与集合的值进行比较。需要规避的问题当然map<K,V>::value_typepair<K,V>while set<V>::value_typeisV所以这些不适用于默认值,默认值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)??? 其他错误都是一样的,编译器“似乎”忽略了一个完美的重载运算符

谢谢大家的帮助

0 投票
1 回答
432 浏览

c++ - 在 std::sort 期间使用自定义比较器进行 std::out_of_range

我有以下代码

现在我有一个简单的排序代码,其中我根据另一个双精度向量对索引向量进行排序。'circle_fwd_vector' 是一个包含所有双精度的向量。

现在在控制台中,我得到这样的结果:

由于我没有使用任何自定义类,并且我正在排序的向量仅基于双打,所以我不确定为什么我会超出范围。我确保双向量中没有无穷大,但即使有,std::sort 不应该在不超出索引的情况下给我正确的排序索引吗?

感谢您的任何帮助。

编辑:如果有帮助,这是发生这种情况时向量的数据转储。 http://pastebin.com/7wLX63FJ另外,我正在使用 Xcode 3.2.6 附带的 GCC 4.2 进行编译。

0 投票
1 回答
787 浏览

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() 的代码:

0 投票
1 回答
915 浏览

c++ - 算法函数:将其设为模板还是采用 std::function 参数?

我有一个名为 Graph 的 C++ 类,它有一个算法方法 for_each_node()。我可以将其设为模板,如下所示:

或者让它使用 std::function,像这样:

标准算法,例如 std::for_each,使用第一种方法,而一些库,例如 gtkmm(它是 GTK+ 的 C++ 绑定),将函数作为包含它们的对象的函数指针。

每个选项的优点和缺点是什么?我不确定该选择哪个。什么会影响选择:我的 Graph 类是否是类模板,或者算法方法需要使用多少不同的函数,或者速度要求?

0 投票
1 回答
1485 浏览

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 变量?)

0 投票
6 回答
5138 浏览

c++ - 如何找到键大于 val 的地图的第一个元素

我有一个map<double,T>(比如说T==string),我想找到地图的第一个元素,使得键大于给定的数字。我查看<algorithm>并找到了upper_boundlower_bound

奇怪的是,我可以使用lower_bound但不是上面的第一个upper_bound,我做错了什么?

0 投票
1 回答
6132 浏览

c++ - 调用“查找”没有匹配的函数

我有以下代码:

我尝试在 Ubuntu 上使用 gcc 4.7.1 编译它并得到以下错误:

这段代码没有做任何事情,因为向量没有用任何内容初始化,但它应该编译。

我怀疑这是一个 gcc 问题,但经过大量挖掘后,我绝望了。如果有人遇到此问题并知道如何解决,请告诉我。

0 投票
1 回答
451 浏览

c++ - 为自定义类重载 std::find

那么std::find对象中的自定义类是否有可能/“好”重载?然后不重载相等运算符。假设一个容器存储(智能)指向它的实际数据的指针,我真的对数据布局或存储模式不感兴趣,我只想找到某个数据成员....

这是否合法,“道德”?如果说我有一个std::vector<std::shared_ptr<myClass> >- 或“甚至”用户定义的容器?还是我应该始终依赖std::find_if此类情况?