是否有使用谓词比较两个范围的标准方法
Is there a standard way to compare two ranges using a predicate?
给定...
string a; // = something.
string b; // = something else. The two strings are of equal length.
string::size_type score = 0;
。我想做的是这样的...
compare(a.cbegin(), a.cend(), b.cbegin(), b.cend(), [&score](const char c1, const char c2) -> void {
if (c1 == c2) { // actually a bit more complicated in real life
score++;
}
});
。但据我所知,似乎没有 std::compare。 最近的似乎是std::lexicographical_compare但这并不完全匹配。 同上,标准::平等。 标准库中真的没有什么合适的吗? 我想我可以自己写(或者使用一个普通的旧 C 样式循环,这就是我所做的,但多么无聊:-)但我认为我正在做的事情很常见,所以这将是一个奇怪的遗漏 IMO。 所以我的问题是我错过了什么吗?
是否有标准算法可以与使用谓词的范围进行比较?是的,std::equal
或std::lexicographical_compare
.
是否有标准算法可以执行代码正在执行的操作? std::inner_product
可以做到这一点:
std::string a = "something";
std::string b = "samething";
auto score = std::inner_product(
a.begin(), a.end(), b.begin(), 0,
[](int x, bool b) { return x + b; },
[](char a, char b) { return a == b; });
但我认为我正在做的事情很常见
不,不是真的。如果您只想对两个范围内的相应元素运行通用函数,则使用zip迭代器for_each
适当的算法。如果标准中缺少任何内容,那就是zip迭代器。为此,我们不需要特殊的算法。
像你在寻找std::mismatch()
它会产生找到第一个差异(当然是结束)的迭代器。但是,它不会计算差异,因为没有为所有类型定义减法。像其他算法一样,std::mismatch()
有谓词的形式,也有没有谓词的形式。
感谢所有回答的人。 我试图做的(更多的是为了我的启迪而不是其他任何事情)是取代这个......
for (string::const_iterator c1 = a.begin(), c2 = b.begin(); c1 != a.end(); ++c1, ++c2) {
if (*c1 == *c2) {
score++;
}
}
。与时髦的新 C++11 的东西:-) 我看了相等、lexicographical_compare等,但我想让我绊倒的是他们采用布尔谓词,如果它返回错误处理停止,而我每次都需要处理整个范围。 然后,在阅读了您给我的答案后,我顿悟了,仅仅因为有返回值并不意味着如果我不需要它,我就不能扔掉它。 通过简单地在我的lambda中始终返回true,我可以使用上述任何算法,它们将运行到范围的末尾。
唯一的问题是,由于我将以与它们名称不同的方式使用这些算法,因此将来可能会导致维护问题,因此我现在只会坚持我无聊的旧循环,但我学到了一些新东西,所以再次感谢。
- 如何在c/c++中检查两个任意内存范围是否重叠
- 我应该如何使用remove_if删除两个数字范围内的元素
- 同一范围内矢量的两个独立"for"循环,仅打印第一个循环
- 重命名两个目录中的文件名,如果它们之间的某些字符匹配 - 矢量下标超出范围
- 是否存在用于按以下方式对两个范围进行排序和分区的标准算法?
- 如何连接两个现有范围::视图
- 创建大小为其他两个矩阵大小的矩阵时超出范围
- 范围V3.两个范围之间的区别
- 为什么基于指针交换两个值在函数范围之外不起作用?
- 是否有使用谓词比较两个范围的标准方法
- 为什么需要两个循环范围来更改C++向量的这些元素
- <algorithm>在同一输入迭代器范围内并排运行两个
- 重载函数的调用是不明确的(两个函数在不同的范围内)
- C++ - 查找两个范围的交集
- 如何让代码存在于两个或多个非嵌套命名空间的范围内
- 按元素添加两个范围的惯用和有效方法
- 将两个范围的值相加并将它们放入第三个范围的算法
- 两个范围之间的随机数
- 获得两个范围的multimap
- 找出两个范围(其中一个已排序)是否有一个公共元素