问题标签 [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 投票
3 回答
1157 浏览

c++ - 如何使用 STL 向量和时间复杂度优于 O(n^2) 的 STL 算法进行左连接?

我有 2 个向量,其中包含 Person(姓名、姓氏等)对象。我想取其中一个向量(我们将其命名为“大”),然后为该向量中的每个元素找到第二个(“小”)中的对应元素,并将“小”向量元素中的一些数据合并到“大”向量元素。此操作与 SQL 术语中的左连接非常相似,但需要对数据进行额外的合并。最简单的方法是进行 2 个周期,但这会导致 O(n^2) 时间复杂度。我可以用 STL 算法做得更好吗?

0 投票
3 回答
1815 浏览

c++ - 使用带有 valarray 的 c++ 标准库算法

我试图避免重新实现我自己笨拙的标准算法版本,因此正在使用标准库版本。由于我不是 C++ 专家,因此我谨慎行事并打开了完整的调试选项。

具体来说,我在valarray容器上使用二进制搜索。以下代码块似乎产生了正确的结果,并且valgrind没有抱怨。尽管如此,我确实觉得我在一个滑坡上,因为我不确定我正在做的事情是否真的被允许,或者我只是被编译器放过了。

有代表性的一段代码:

问题:

  1. 我在这里做的事情真的合法吗?
  2. 为什么两个指向 double 的指针之间的差异变成了 int?(与???评论一致)
  3. 类型转换的开销是多少?--- 我关心的是效率,因为这种功能将位于代码部分,占用超过 90% 的计算时间。
0 投票
3 回答
761 浏览

c++ - 如何迭代到更小的容器中(即 stride != 1)

这里有一个精神上非常相似的问题。不幸的是,这个问题没有引起太多的回应——我想我会问一个更具体的问题,希望可以提出一种替代方法。

我正在将二进制文件写入std::cin(使用tar --to-command=./myprog)。二进制文件恰好是一组浮点数,我想将数据放入std::vector<float>- 理想情况下是 c++ 方式。

std::vector<char>我可以很好地 生成一个(感谢这个答案

我现在想将 mystd::vector<char>转换为 a std::vector<float>,大概是 withstd::transform和一个进行转换的函数(例如 achar[2]到 a float)。然而,我正在苦苦挣扎,因为我std::vector<float>的元素将是std::vector<char>. 如果我可以以 2 的步幅进行迭代,那么我想我会很好,但从前面的问题来看,我似乎不能这样做(至少不能优雅地)。

0 投票
2 回答
2291 浏览

c++ - 使用带有 shared_ptr、函数对象的 STL 算法

我有一组 shared_ptr,我想将 remove_copy_if 与谓词的自定义函数对象一起使用。我不知道做到这一点的“最佳”方式。现在,我有这个工作:

我决定对 shared_ptr 进行 const 引用,因为该对象不会保留指针,而且这似乎比 shared_ptr 的额外副本更有效。

似乎只对对象进行 const 引用会更好,但我无法编译它。我把它改成了这个,但没有运气:

这是 g++ 的输出:

有没有其他方法可以做到,或者有什么建议吗?

0 投票
3 回答
3315 浏览

c++ - 在 shared_ptr 的容器上使用 C++ std::equal

我有一个 std::shared_ptr 容器。我想使用 std::equal 比较两个容器。A 类定义了 operator==。我想比较每个元素是否使用其运算符 == 等效,而不是在 shared_ptr 中定义的那个。

我需要使函数或函数对象传递给相等吗?还是有一些更简单的内置功能(如 <functional> 中定义的东西)?

0 投票
1 回答
2061 浏览

c++ - 如何根据 std::remove_copy_if 实现 copy_if?

我已经制定了一个大部分时间都有效的解决方案:

唯一不起作用的情况是函数指针采用 const ref 参数。这会导致以下编译器错误:

显然,这里试图引用一个参考。

我的问题是:如何实现copy_if满足以下条件的:

  1. 根据 std::remove_copy_if 实现
  2. 必须使用函数对象和函数指针
  3. 没有定义辅助类(在函数范围之外)
  4. 使用纯 C++ 和 STL(无 C++0x 或 boost)

更新

我认为这是可能的,因为它适用于boost::bind

0 投票
4 回答
4540 浏览

c++ - C ++ 11中的最小和最大可变参数模板变体?

我是否正确地阅读了从minmaxminmax就此而言)有新的initializer_list变体但没有Variadic Template变体的标准?

因此,这没关系:

但这不是:

我想,很多人会期望 Variadic Templates 可以轻松实现这一点,因此他们可能会感到失望。

我会说将VT用于min并且max会矫枉过正

  • 可变参数模板能够处理多种类型
  • 初始化器列表检查所有类型在设计上是否相同

因此 IL 更适合这项任务。

我的解释正确吗?

0 投票
1 回答
90 浏览

c++ - 选择满足条件的特定对象

假设我有看起来非常粗略的对象:

我将这些对象存储在一个向量中,并且该向量相当小(例如,最多大约 1000 个元素)。然后,在性能关键算法中,我想选择既具有属性 X具有最小大小的对象(如果有多个这样的对象,请选择其中任何一个)。我需要多次“选择”,并且属性 X 的持有和大小在选择之间可能会有所不同,因此对象在这里是动态的。两个查询(属性、大小)都可以在恒定时间内进行。

我将如何最好地实现这一目标?性能在这里被认为很重要。我目前的想法:

1) 将 std::min_element 与合适的谓词一起使用。这可能还需要 boost::filter_iterator 或类似的东西来迭代满足属性 X 的对象?

2)使用一些数据结构,例如优先级队列。我会存储指向对象的指针或reference_wrappers 等等。至少对我来说,这感觉很慢,而且由于对象的动态特性,它甚至可能不可行。

对这些想法还有其他建议或意见吗?我应该继续尝试这些方案和配置文件中的任何一个或两个吗?

0 投票
1 回答
815 浏览

templates - 不会在 Dev C++ 编译器上编译

我正在尝试使用 Dev_C++ 4.9.9.2 编译器移植一些代码,但我无法让它识别标准算法模板,如

每当我尝试编译时,都会收到大量错误消息,其中大多数是“带有 C 链接的模板”。我究竟做错了什么?我需要在编译器上调整一些设置吗?

技术规格 - 我在 Oracle VirtualBox 上的 Windows XP SP3 上运行编译器,而后者又在 Ubuntu 10.10 AMD64 主机上。

0 投票
5 回答
3822 浏览

c++ - STL算法的可组合性

STL 算法在 C++ 中非常有用。但让我感到厌烦的一件事是它们似乎缺乏可组合性。

例如,假设我有 avector<pair<int, int>>并且想要将其转换为vector<int>仅包含对的second成员的 a。这很简单:

或者,也许我只想过滤vector那些first成员为偶数的对。也很简单:

但是如果我想两者都做呢?没有transform_if算法,并且使用两者transform似乎copy_if需要分配一个临时vector来保存中间结果:

这对我来说似乎相当浪费。我能想到的避免临时向量的唯一方法是放弃transformcopy_if简单地使用for_each(或常规的 for 循环,以适合您的方式):

我在这里错过了什么吗?有没有一种不需要临时存储就可以将两个现有的 STL 算法组合成一个新算法的好方法?