这个使用boost::mismatch的例子是什么意思?

What does this example of using boost::mismatch mean?

本文关键字:是什么 意思 mismatch boost      更新时间:2023-10-16

我试着理解下面给出的例子:

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不相等。

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

rng1rng2分别是SinglePassRange1SinglePassRange2类的对象。但是这些类是什么呢?它们在哪里定义?它们应该是"范围",但什么是"范围"?

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

range是一对操作在同一容器上的迭代器。SinglePassRange是这样一个范围,其中迭代器是单遍迭代器,即:可比较和可递增的迭代器。通过重载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);  
 }

我也不清楚这些行前的召唤是什么失配函数。第一行看起来我们要定义一个类模板,但我们以后不这样做。

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

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

正如您所链接的页面下面进一步说明的那样,输入必须具有单一通道范围概念模型的类型。

更多关于增压范围的信息,请访问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>