【问题标题】:What does this example of using boost::mismatch mean?这个使用 boost::mismatch 的例子是什么意思?
【发布时间】:2013-04-10 08:55:51
【问题描述】:

我试着理解下面给出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 不相等。

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

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

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

【问题讨论】:

    标签: c++ templates boost syntax mismatch


    【解决方案1】:

    范围是在同一个容器上运行的一对迭代器。 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);  
     }
    

    【讨论】:

      【解决方案2】:

      我也不清楚在调用 mismatch 函数可以。第一行看起来我们要 定义一个类模板,但我们以后不做。

      这不是一个例子。它是一个 function 模板的声明,它是 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&lt;boost::range_iterator&lt;vector&lt;string&gt;&gt;::type, boost::range_iterator&lt;list&lt;string&gt;&gt;::type&gt;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-11
        • 2018-10-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多