问题标签 [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++ - 如何使用 STL 向量和时间复杂度优于 O(n^2) 的 STL 算法进行左连接?
我有 2 个向量,其中包含 Person(姓名、姓氏等)对象。我想取其中一个向量(我们将其命名为“大”),然后为该向量中的每个元素找到第二个(“小”)中的对应元素,并将“小”向量元素中的一些数据合并到“大”向量元素。此操作与 SQL 术语中的左连接非常相似,但需要对数据进行额外的合并。最简单的方法是进行 2 个周期,但这会导致 O(n^2) 时间复杂度。我可以用 STL 算法做得更好吗?
c++ - 使用带有 valarray 的 c++ 标准库算法
我试图避免重新实现我自己笨拙的标准算法版本,因此正在使用标准库版本。由于我不是 C++ 专家,因此我谨慎行事并打开了完整的调试选项。
具体来说,我在valarray
容器上使用二进制搜索。以下代码块似乎产生了正确的结果,并且valgrind
没有抱怨。尽管如此,我确实觉得我在一个滑坡上,因为我不确定我正在做的事情是否真的被允许,或者我只是被编译器放过了。
有代表性的一段代码:
问题:
- 我在这里做的事情真的合法吗?
- 为什么两个指向 double 的指针之间的差异变成了 int?(与
???
评论一致) 类型转换的开销是多少?--- 我关心的是效率,因为这种功能将位于代码部分,占用超过 90% 的计算时间。
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 的步幅进行迭代,那么我想我会很好,但从前面的问题来看,我似乎不能这样做(至少不能优雅地)。
c++ - 使用带有 shared_ptr、函数对象的 STL 算法
我有一组 shared_ptr,我想将 remove_copy_if 与谓词的自定义函数对象一起使用。我不知道做到这一点的“最佳”方式。现在,我有这个工作:
我决定对 shared_ptr 进行 const 引用,因为该对象不会保留指针,而且这似乎比 shared_ptr 的额外副本更有效。
似乎只对对象进行 const 引用会更好,但我无法编译它。我把它改成了这个,但没有运气:
这是 g++ 的输出:
有没有其他方法可以做到,或者有什么建议吗?
c++ - 在 shared_ptr 的容器上使用 C++ std::equal
我有一个 std::shared_ptr 容器。我想使用 std::equal 比较两个容器。A 类定义了 operator==。我想比较每个元素是否使用其运算符 == 等效,而不是在 shared_ptr 中定义的那个。
我需要使函数或函数对象传递给相等吗?还是有一些更简单的内置功能(如 <functional> 中定义的东西)?
c++ - 如何根据 std::remove_copy_if 实现 copy_if?
我已经制定了一个大部分时间都有效的解决方案:
唯一不起作用的情况是函数指针采用 const ref 参数。这会导致以下编译器错误:
显然,这里试图引用一个参考。
我的问题是:如何实现copy_if
满足以下条件的:
- 根据 std::remove_copy_if 实现
- 必须使用函数对象和函数指针
- 没有定义辅助类(在函数范围之外)
- 使用纯 C++ 和 STL(无 C++0x 或 boost)
更新
我认为这是可能的,因为它适用于boost::bind
:
c++ - C ++ 11中的最小和最大可变参数模板变体?
我是否正确地阅读了从min
和max
(minmax
就此而言)有新的initializer_list变体但没有Variadic Template变体的标准?
因此,这没关系:
但这不是:
我想,很多人会期望 Variadic Templates 可以轻松实现这一点,因此他们可能会感到失望。
我会说将VT用于min
并且max
会矫枉过正
- 可变参数模板能够处理多种类型
- 初始化器列表检查所有类型在设计上是否相同
因此 IL 更适合这项任务。
我的解释正确吗?
c++ - 选择满足条件的特定对象
假设我有看起来非常粗略的对象:
我将这些对象存储在一个向量中,并且该向量相当小(例如,最多大约 1000 个元素)。然后,在性能关键算法中,我想选择既具有属性 X又具有最小大小的对象(如果有多个这样的对象,请选择其中任何一个)。我需要多次“选择”,并且属性 X 的持有和大小在选择之间可能会有所不同,因此对象在这里是动态的。两个查询(属性、大小)都可以在恒定时间内进行。
我将如何最好地实现这一目标?性能在这里被认为很重要。我目前的想法:
1) 将 std::min_element 与合适的谓词一起使用。这可能还需要 boost::filter_iterator 或类似的东西来迭代满足属性 X 的对象?
2)使用一些数据结构,例如优先级队列。我会存储指向对象的指针或reference_wrappers 等等。至少对我来说,这感觉很慢,而且由于对象的动态特性,它甚至可能不可行。
对这些想法还有其他建议或意见吗?我应该继续尝试这些方案和配置文件中的任何一个或两个吗?
templates - 不会在 Dev C++ 编译器上编译
我正在尝试使用 Dev_C++ 4.9.9.2 编译器移植一些代码,但我无法让它识别标准算法模板,如
每当我尝试编译时,都会收到大量错误消息,其中大多数是“带有 C 链接的模板”。我究竟做错了什么?我需要在编译器上调整一些设置吗?
技术规格 - 我在 Oracle VirtualBox 上的 Windows XP SP3 上运行编译器,而后者又在 Ubuntu 10.10 AMD64 主机上。
c++ - STL算法的可组合性
STL 算法在 C++ 中非常有用。但让我感到厌烦的一件事是它们似乎缺乏可组合性。
例如,假设我有 avector<pair<int, int>>
并且想要将其转换为vector<int>
仅包含对的second
成员的 a。这很简单:
或者,也许我只想过滤vector
那些first
成员为偶数的对。也很简单:
但是如果我想两者都做呢?没有transform_if
算法,并且使用两者transform
似乎copy_if
需要分配一个临时vector
来保存中间结果:
这对我来说似乎相当浪费。我能想到的避免临时向量的唯一方法是放弃transform
并copy_if
简单地使用for_each
(或常规的 for 循环,以适合您的方式):
我在这里错过了什么吗?有没有一种不需要临时存储就可以将两个现有的 STL 算法组合成一个新算法的好方法?