以一种漂亮的STL方式检查一个范围是否是另一个范围的子范围
Check if one range is a subrange of another range in a nice, STL-ish way
假设我们有两个范围r1 = [first1, last1)
和r2 = [first2, last2)
假设r2
是r1
的子范围,当存在这样的i>=0
时,
-
[first1 + i, first1 + i + last2 - first2)
是有效范围 -
对于
[0, last2 - first2)
中的所有j,以下情况成立:*(first1 + i + j) == *(first2 + j)
嵌套循环可以很容易地确定r2
是否是r1
的子范围,或者甚至是具有对std::equal
模板的嵌套调用的一个循环。有没有一种更STL风格、更简洁的方式来用C++表达同样的想法?C++0x解决方案也很受欢迎。提前谢谢。
我认为std::search
正是您想要的。从…起http://www.cplusplus.com/reference/algorithm/search/[std::search
]"在范围[first1,last1)中搜索[first2,last2)定义的序列的第一次出现,并将迭代器返回到其第一个元素。"
这是我之前的评论:
#include <iostream>
#include <vector>
#include <iterator>
template<class MyIterator>
bool is_subrange(const MyIterator& first1, const MyIterator& last1, const MyIterator& first2, const MyIterator& last2)
{
return std::distance(first1, first2) >=0 && std::distance(last2, last1) >= 0;
}
int main()
{
std::vector<int> v;
for (int i=0; i < 100; ++i)
v.push_back(i);
std::cout << std::distance(v.begin(), v.end()) << std::endl;
std::cout << std::distance(v.end(), ++v.begin()) << std::endl;
std::cout << is_subrange(v.begin(), v.end(), ++v.begin(), --v.end()) << std::endl;
std::cout << is_subrange(++v.begin(), v.end(), v.begin(), --v.end()) << std::endl;
return 0;
}
这避免了在处理向量等相同简单容器内的子范围时比较每个元素。
当然,函数is_subrange()非常简单,但对于列表来说会变得更复杂,因为它们是双重链接的,因此距离永远不会是负的,例如std::distance(l.begin(),l.end())==1和std::distance(l.end(。[100,0]和[20,4]的范围也不由这个简单的样本处理,但它是可行的。
无论如何,std::search()将完成Mark-b 之前发布的工作
欢呼,
相关文章:
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 重载运算符的范围是什么?它是否会影响作为类成员的集合的插入函数?
- set_intersection范围范围
- 程序中的布尔函数返回输入的范围无论如何都是无效的
- 在C++中使用变量而不是"#define"来指定数组大小是不是一种糟糕的做法?(C错误:在文件范围内
- 在 c++ 中解决段树以外的范围查询的有效方法是什么?
- 这个变量在 C++ 中的范围是什么?
- 私有在函数定义/实现的返回值范围内是什么意思 (c++)?
- 满足标准::范围::范围概念
- 向量向量的范围范围
- 为什么这个循环变量在循环范围之外是可访问的
- 运算符重载中变量的数据类型和范围应该是什么
- 统一实际分布的范围限制是多少
- 用辅助方法范围范围的问题来操纵字符串
- 用于循环范围范围
- 在C++中实现随机预言机(输出在范围内是随机的,但对于相同的输入输出是相同的)
- 在C++11中,用什么方法对数组进行简单的范围管理是最干净的
- 矢量超出范围/范围检查
- 以一种漂亮的STL方式检查一个范围是否是另一个范围的子范围