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

时间:2013-04-10 08:55:52

标签: c++ templates boost syntax mismatch

我尝试理解给定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不相等。

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

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

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

2 个答案:

答案 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>