我尝试理解给定here的以下示例:
template<class SinglePassRange1, class SinglePassRange2>
std::pair <
typename range_iterator<SinglePassRange1>::type,
typename range_iterator<const SinglePassRange2>::type
>
mismatch(SinglePassRange1& rng1, const SinglePassRange2& rng2);
以下是描述:
mismatch找到相应元素的第一个位置 从两个范围rng1和rng2不相等。
在上面的例子中我不清楚的主要事情是:什么是输入,什么是不匹配函数的输出?
rng1
和rng2
分别是类SinglePassRange1
和SinglePassRange2
的对象。但是这些课程是什么?他们在哪里定义?它们应该是“范围”,但什么是“范围”?
在调用mismatch
函数之前,我还不清楚所有这些行是什么。第一行看起来像我们要定义一个类模板,但我们不会在以后这样做。
答案 0 :(得分:2)
范围是在同一容器上运行的一对迭代器。 SinglePassRange
是这样一个范围,其中迭代器是单通道迭代器,即。迭代器具有可比性和可递增性。通过重载mismatch
函数,参数也可以是支持该类型的范围迭代器的容器,在这种情况下,使用容器的begin()
和end()
迭代器。
返回的值是第一对迭代器 - 每个范围中的一个 - 不满足等式谓词。该对是模板参数声明后前几行所描述的内容。
std::pair <
typename range_iterator<SinglePassRange1>::type,
typename range_iterator<const SinglePassRange2>::type
>
如您所见,每个参数都是每个范围类型的范围迭代器的类型。
参数之前的关键字typename
是必要的,因为两者实际上都是dependent names,即。在其他类型中定义的类型,它们本身依赖于外部模板参数(SinglePassRange1
和2)。
mismatch
函数可能类似于以下(类型省略):
auto mismatch(auto &rng1, auto &rng2){
auto it1 = rng1.first, it2 = rng2.first;
while (it1 != rng1.second && it2 != rng2.second)
if (it1 != it2)
break;
else { ++it1; ++it2; }
return make_pair(it1, it2);
}
答案 1 :(得分:1)
在调用之前,我还不清楚所有这些行 不匹配功能。第一行看起来像我们要去的那样 定义一个类模板,但我们以后不会这样做。
这不是一个例子。它是功能模板的声明,它是升级范围库的一部分。
在上面的例子中我不清楚的主要事情是:什么 是作为输入给出的,不匹配函数的输出是什么?
如下面在您链接的页面上进一步说明的那样,输入必须具有单通道范围概念模型的类型。
有关提升范围的更多信息,请访问http://www.boost.org/doc/libs/1_50_0_beta1/libs/range/doc/html/range/introduction.html
如上所述,最常见的用途是传递标准容器。内置阵列也可以工作。 boost::iterator_range
允许您使用形成范围的任何一对(前向)迭代器。
所以你可以拥有
vector<string> vec { ... };
list<string> lis { ... };
auto result = mismatch(vec, lis);
此处result
的类型为pair<boost::range_iterator<vector<string>>::type, boost::range_iterator<list<string>>::type>