2

我尝试理解此处给出的以下示例:

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 中对应元素不相等的第一个位置。

在上面的例子中,我主要不清楚的是:什么是输入,什么是 mismatch 函数的输出?

rng1rng2分别是类SinglePassRange1和的对象SinglePassRange2。但是这些类是什么?它们在哪里定义?它们应该是“范围”,但什么是“范围”?

我也不清楚在调用mismatch函数之前所有这些行是做什么的。第一行看起来我们要定义一个类模板,但我们稍后不会这样做。

4

2 回答 2

2

范围是在同一容器上运行的一对迭代器。ASinglePassRange 是这样一个范围,其中迭代器是单遍迭代器,即。可比较且可递增的迭代器。通过mismatch函数的重载,参数也可以是支持该类型范围迭代器的容器,在这种情况下使用容器的begin()end()迭代器。

返回的值是第一对迭代器——每个范围中的一个——不满足等式谓词。这对是模板参数声明后的前几行所描述的。

std::pair <
    typename range_iterator<SinglePassRange1>::type,
    typename range_iterator<const SinglePassRange2>::type
>

如您所见,每个参数都是每个范围类型的范围迭代器的类型。

参数之前的关键字typename是必要的,因为两者实际上都是依赖名称,即。在其他类型中定义的类型,它们本身依赖于外部模板参数(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);  
 }
于 2013-04-10T09:17:41.650 回答
1

我也不清楚调用 mismatch 函数之前所有这些行的作用。第一行看起来我们要定义一个类模板,但我们稍后不会这样做。

这不是一个例子。它是一个函数模板的声明,它是 boost range 库的一部分。

在上面的例子中,我主要不清楚的是:什么是输入,什么是 mismatch 函数的输出?

正如您链接的页面上进一步记录的那样,输入的类型必须是单程范围概念的模型。

有关提升范围的更多信息,请访问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>

于 2013-04-10T09:17:09.990 回答