问题标签 [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++ - 在向量上使用算法中的查找函数
我想在向量对象上使用算法库中的 find 函数。向量对象是客户的向量,(客户是我做的一个类)。我第一次运行它,它给了我一个错误stl_algo.h
。我在网上搜索它,我也在这里搜索它,我在这里找到了一个关于它的问题,我运行了相同的代码,但我仍然得到了那个错误。
我的代码在这里:
头文件:
源代码:
在使用 Code::Blocks 构建之后,我得到了这个,
在头文件中stl_algo.h
:
谢谢
编辑:这是构建日志
c++ - 对向量设置操作
我想在两个向量上进行所有集合操作,即联合、交集、异或和减法。我怎样才能做到这一点 ?
查看链接:设置操作的图像
c++ - 高效函数调用匹配的数据结构
我正在构建一个工具,除其他外,它必须衡量我们产品更改对性能相关的影响。
为了做到这一点,我实现了一个分析器,它跟踪函数何时被调用或返回并通知我。首先,我将输出转储到一个文件中,以了解我将使用的数据,这里或多或少是它们的样子:
为了更好地了解这些数据的外观,这里是前 10000 个函数调用的图表:(x 轴:时间,y 轴:深度/嵌套):
(http://img444.imageshack.us /img444/4710/proflog.gif )
当一个函数开始执行时,我将记录它的名称/标识符和当前的高精度时间戳,当它返回时,我需要查找我存储开始时间的条目并添加一个新的时间戳来标记它返回。
总而言之,我将对这些数据执行的操作是:
- 插入具有当前时间戳的新函数调用标记。
- 查找某个 ID 的最近一次函数调用并存储返回时间戳。
- 查看从某个函数中调用了哪些其他函数(并查看它在哪里花费时间) - 例如,如果我在前面的示例中查看 Function#2,我想知道它调用 Function#3、Function# 4、Function#5 和 Function#5 调用 Function#6 然后返回(标记所有调用/返回时间戳)。
现在,我对可能适用于这种情况的数据结构有几个想法:
一个自动平衡树(即 AVL),其中每个节点的键是函数标识符,每个节点中的值是时间戳对的堆栈。这种方法将在标记函数时间戳时为我提供快速插入和查找,并且每个节点都是一个堆栈这一事实,它还将负责将正确的返回时间戳与开始时间戳相匹配 - 始终(我假设)a 的最新返回时间戳某些函数应该匹配最近的嵌套/最近的函数调用。在这种方法中,维护具有不同标识符的嵌套函数调用会有点麻烦,因为我必须遍历树并根据它们的时间戳匹配它们以找出它们的嵌套 - 这并不理想。
维护一个尚未返回的函数列表(这将保留调用堆栈信息)并使用跳过列表,其中每个级别都等于函数调用嵌套级别。这种方法会使操作 #3 更容易,但查找速度会变慢,而且我可能必须维护很长的未返回函数列表 - 例如 main(),这将必须在我的应用程序的整个生命周期中维护。在这里,我还可以使用哈希表,以牺牲更多内存使用来提高查找速度。内存使用很关键——这个分析器很容易生成大约 20 MB / s。
我不使用简单堆栈来跟踪这些数据的原因是,我需要定期将部分结果同步到不同的机器,并且在一切返回之前至少有部分结果可用。
我查看了区间树、范围树和其他我知道的数据结构,但我找不到任何能有效满足我所有 3 个要求的数据结构。
也许有一种数据结构可以满足我不知道的所有需求?有任何想法吗?
更新:
那这个呢:
拥有一棵树,其中包含函数调用及其嵌套调用以及未返回的函数的单独堆栈。
现在堆栈上的每个元素都有一个指向它在树中的副本的指针,当一个新的函数调用到达时,我将查看堆栈上的顶部元素,跟踪它指向它在树中的表示的指针,添加新的函数调用作为该调用的子节点,并使用指向新创建的树节点的指针将其副本推送到堆栈上。
对于函数返回,它是类似的,对于每个函数返回,堆栈上的最新条目将始终是它的调用 - 跟踪调用指针,将返回时间保存在树中并弹出调用。
你看到我的想法有什么重大缺陷吗?
更新 2:
我的方法效果很好。我将等待 2 天并回答我的问题。
c++ - 记忆保守的最大独立顶点集
我想为无向图中设置的最大独立顶点找到一种内存保守但有效的算法。
传统算法使用辅助数据结构(原始图的副本)来实现它。我想避免这种并行结构,因为内存分配对于实时实现来说很慢,而且我有一些内存边界。我只想用布尔标签标记 MIS 中的节点。可能吗?
请注意,我不想要最大独立集,而是最大独立集。
PS 我知道这个问题与语言无关,但我使用 C++ 和 STL 进行编码。
c++ - 如何按元素出现的次数将多重集排序到容器中
我想按出现次数对元素进行排序。这就是我想出的(mHeights 是一个 std::multiset):
因此,首先我从多重集中获取所有唯一元素,然后对它们进行计数并将它们分类到一个新容器中(我需要计数,所以我使用地图)。对于如此简单的任务,这看起来相当复杂。除了在其他地方也使用的 HistPair 之外,没有任何 stl 算法可以简化此任务,例如使用 equal_range 或 sth。一样。
编辑:我也需要出现次数,抱歉我忘记了
c++ - 是否允许标准库算法复制谓词参数?
假设我们想从int
s 的向量中删除重复值。通常的解决方案是使用erase-remove idiom对向量进行排序并擦除重复项。但是我们需要维护不会被删除的元素的顺序,所以我们不能排序。所以有人可能会想出一个这样的谓词并使用 withremove_if
算法:
但是如果谓词对象由于某种原因被复制,这将中断,因为我们将获得set
成员的两个副本。事实上,gcc 的实现remove_if
正是这样做的:
解决方法是使set
我们的仿函数成员静态:
但问题仍然存在:
我们是否需要确保谓词函子的可能副本不会破坏我们的逻辑? 标准中是否有任何规定(或禁止)与此问题相关的某些行为?或者它是实现中的错误?
c++ - binary_search() 需要自定义类比较
我有一个自定义类并std::vector
填充了此类的对象。我想binary_search
在这个数组中做。
我在我的类上重载了运算符,如下所示:
他们工作正常(他们有身体,是的)。
现在我有一个错误错误
我应该制作复制构造函数(已经重载=,但没有帮助)还是向运算符添加其他内容?
谢谢。
c++ - 根据另一个向量对点向量进行排序
我正在开发一个 C++ 应用程序。
我有 2 个点向量
Point2f 定义typedef Point_<float> Point2f;
vectorAll 有 1000 分,而 vectorSpecial 有 10 分。
第一步:
我需要根据它们在vectorAll中的顺序对vectorSpecial中的点进行排序。所以是这样的:
我可以做一个双循环并保存索引。然后根据它们的索引对点进行排序。但是,当我们有很多点时(例如,vectorAll 中的 10000 个点和 vectorSpecial 中的 1000 个点,所以这是一千万次迭代),这种方法花费的时间太长了
有什么更好的方法来做到这一点?
第二步:
vectorSpecial 中的某些点可能在 vectorAll 中不可用。我需要采取最接近它的点(通过使用通常的距离公式sqrt((x1-x2)^2 + (y1-y2)^2)
)
这也可以在循环时完成,但如果有人对更好的方法有任何建议,我将不胜感激。
非常感谢您的帮助
c++ - 如何对 std::shared_ptr 的容器进行排序对象?
如何根据标准对容器进行排序,而不定义另一个标准,例如:
c++ - 找到集合并集的最快方法
我有成对的 int 像
set<pair<int,int> > x1, x2, ... xn
( n 可以在 2 到 20 之间)。找到这些集合的最快方法是什么?
对不起,如果我一开始没有说清楚,我的意思是性能快,内存分配不是问题。