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

c++ - fill_n 和 fill 是同一个函数,但参数重载不同吗?

我正在研究<algorithm>'sfillfill_nfunction,对我来说,它们似乎在做同样的事情,只是定义不同。

这是真的吗?如果不是,它们有何不同?

他们描述的措辞似乎大致相同(我从 MSDN 在fill_n和处读到fill)。

如果它们相同,那么同时使用这两个功能有什么好处?

只是为开发人员提供更多选择,还是一种比另一种更快?

0 投票
1 回答
562 浏览

c++ - list::iterator 上的算术运算?

我有一个list这样的:

而且我知道 中有 10 个元素l,我想从中获取前 7 个元素l并将它们分配给 a vector,所以我尝试这样做:

上面的代码不能编译,后来发现,list不支持随机访问,而支持vector,所以list::iterator不支持算术运算?

如果是这样,我怎样才能完成上述工作?

0 投票
2 回答
218 浏览

c++ - 字符串向量排序

我没有过多地使用排序和算法,并且对向量很好。最近我遇到了一个有趣的问题,想请教您如何解决它。所以,下面是我的问题。

问,我在一个向量中获得了 4 个字符串,并且必须根据这些字符的特定顺序排列这些字符串。因此,任何字符串的最后一个字符都应该与任何其他字符串的第一个字符匹配,并且该字符串的最后一个字符应该与任何其他字符串的第一个字符匹配,这样我必须创建一个可能最长的字符串。

例如,如果我有一个像“ABCD”“TGHI”“DADC”“IYUR”“CXYT”这样的字符串向量,那么它将像“ABCD”那样排列,那么会有第三个字符串“DADC”然后会有第五个字符串"CXYT" 等等 所以,结果将是 "ABCD""DADC""CXYT""TGHI""IYUR"。

现在,我想知道根据上述规则检查每个字符串与其他字符串是否“兼容”是否是个好主意。所以如果我在向量中有 5 个字符串,那么我将有 5+4+3 +2+1 可能性,如果例如我有 20 个字符串,那么它会增加很多,所以这是一个好主意还是有任何其他有效的解决方案...非常感谢,希望(大部分)你能理解。

0 投票
2 回答
2118 浏览

c++ - 将 for_each 与 tolower() 一起使用

我正在尝试使用 STL 函数 for_each 将字符串转换为小写,但我不知道我做错了什么。这是有问题的 for_each 行:

clean = for_each(temp.begin(), temp.end(), low);

其中 temp 是一个包含字符串的字符串。这是我为低写的函数:

我不断收到的编译器错误是这样的:

我究竟做错了什么?

编辑:这是我正在编写的整个函数:

0 投票
2 回答
5575 浏览

c++ - 重载比较运算符以在 C++ 中使用 STL 排序

我正在编写一个程序,它将读取带有社会安全号码(当然不是真实号码)的姓名列表,并根据命令行参数根据姓氏或 ssn 对列表进行排序。为了简单起见,我重载了 < 运算符,还重载了输入和输出运算符。一切编译正常,直到我在 main 末尾添加排序函数和输出。我难住了。有任何想法吗?任何其他提示也非常感谢。

0 投票
3 回答
5920 浏览

c++ - 以相反的顺序获取`std::priority_queue`元素?

我已经编写了一些 K-nearest-neighbor 查询方法,这些方法构建了一个最接近给定查询点的点列表。为了维护该邻居列表,我使用std::priority_queue顶部元素是查询点最远的邻居。这样我就知道是否应该推送当前正在检查的新元素(如果距离小于当前最远的邻居),并且当我的优先级队列有超过 K 个元素时可以 pop() 最远的元素。

到目前为止,一切都很好。但是,当我输出元素时,我想从最近到最远的顺序排列它们。目前,我只是简单地从优先级队列中弹出所有元素并将它们放在输出容器上(通过迭代器),这会产生从最远到最近排序的点序列,因此,我调用std::reverse输出迭代器范围.

作为一个简单的例子,这里是一个使用优先队列的线性搜索(显然,我使用的实际最近邻查询方法要复杂得多):

除了一件事之外,以上都是花花公子:它要求输出迭代器类型是双向的,并且本质上指向一个预先分配的容器。现在,这种将输出存储在某个输出迭代器规定的范围内的做法也非常棒且非常标准(例如std::copy,其他 STL 算法就是很好的例子)。但是,在这种情况下,我希望能够只需要一个前向输出迭代器类型,这样就可以使用为 STL 容器和 iostream 提供的反向插入器迭代器。

因此,这归结为在将其内容转储到输出迭代器之前反转优先级队列。所以,这些是我能够想出的更好的选择:

  • 创建一个std::vector,转储其中的优先级队列内容,并使用向量上的反向迭代器将元素转储到输出迭代器中。

  • 将 替换为std::priority_queue已排序的容器(例如std::multimap),然后使用适当的遍历顺序将内容转储到输出迭代器中。

还有其他合理的选择吗?

在我上面的第二个选项中,我曾经在此算法和其他算法的先前实现中使用 a std::multimap。但是,当我切换到 时std::priority_queue,性能提升非常显着。所以,我宁愿不使用第二个选项,因为看起来使用优先级队列来维护邻居列表比依赖排序数组要好得多。顺便说一句,我还尝试了一个std::vector我维护的 sorted with std::inplace_merge,它比 multimap 更好,但与优先级队列不匹配。

至于第一个选项,这是我目前最好的选择,对我来说,必须进行这种数据的双重传输(队列 -> 向量 -> 输出)似乎很浪费。我只是倾向于认为必须有一种更简单的方法来做到这一点......我错过了一些东西......

第一个选项在这个应用程序中确实不是那么糟糕(考虑到它之前的算法的复杂性),但是如果有避免这种双重内存传输的技巧,我想知道它。

0 投票
2 回答
12214 浏览

c++ - 地图,拉姆达,remove_if

所以,我对 std::map、lambda 和 stl 算法(remove_if)有疑问。实际上,与 std::list 或 std::vector 相同的代码效果很好。

我的测试示例:

错误信息 :

我不明白这里有什么问题。所以,我很高兴阅读一些关于它的建议/指导。我的目标 - 使用带有 std::map 和算法的新 lambda 样式,例如 remove_if。

g++ 4.6,-std=c++0x。

0 投票
3 回答
1852 浏览

c++ - 从 C++ 中的容器中选择 k 个最小元素的“最佳”(惯用)方法

我发现自己经常遇到这个问题:给定一个序列,找到 k 最小的元素。这个问题并不难,但我正在寻找一种既安全又安全的“惯用”方式(很少有地方适合错误)并且可以很好地传达意图。所以最终要做的是对序列进行排序,然后取第一个 k 元素:

这在我看来既安全又容易理解,但这里的复杂性是 nlogn + k,而不仅仅是 n。你们是怎么做到的,有没有一种惯用的方式(可能使用一些晦涩的功能)可以提供最佳的复杂性,而无需重新实现轮子

0 投票
2 回答
1086 浏览

c++ - 使用 for_each() AND lambda 函数打印 C 样式数组的模板函数

很简单的事情。但我花了最后一个小时,无法弄清楚。

当我编译以下代码时:

我得到的编译错误是:

d:\mingw\bin../lib/gcc/mingw32/4.5.2/include/c++/bits/stl_algo.h:4185 是for_each调用作为第三个参数传递给它的函数的地方:__f(*__first);

我理解这个问题,我的 lambda 函数被声明为期望int*,但模板实例for_eachint. 我只是不知道如何以某种generic方式解决它。

我当然可以通过明确类型来解决,但这不是通用的:

0 投票
1 回答
1326 浏览

c++ - 使用 ifstream 复制算法

以下代码的行为不像我预期的那样。请帮助我了解它是如何工作的。

我的自定义 operator>> 被调用了两次,但我希望它只被调用一次,因为内容是:

约翰:四十:21-5821-0