std :: find_if_not()返回什么类型?

时间:2013-12-12 09:20:47

标签: c++ algorithm c++11 stl iterator

C ++ Primer 这本书开始练习时我陷入困境,其中包括:

  

练习10.24:使用bind和check_size查找a中的第一个元素   int的向量,其值大于指定的长度   字符串值。

我的代码:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <functional>

bool check_size(const std::string &s, std::string::size_type sz)
{
   return s.size() > sz;
}

std::vector<int>::iterator
find_first_bigger(const std::vector<int> &v, const std::string &s);

int main(){return 0;}

std::vector<int>::iterator
find_first_bigger(const std::vector<int> &v, const std::string &s)
{
    auto it= std::find_if_not(v.begin(), v.end(),std::bind(check_size,s,std::placeholders::_1));
    return it;
}

在尝试编译时,编译器抱怨说:

  

error: could not convert 'it' from '__gnu_cxx::__normal_iterator<const int*, std::vector<int> >' to 'std::vector<int>::iterator {aka __gnu_cxx::__normal_iterator<int*, std::vector<int> >}'

为了找出发生了什么,我转向标题* stl_algo.h *,其中我猜std :: find_if_not已经定义。那里的评论说:

  

@return @p [_ first _last>

范围内的第一个迭代器@c i

此功能的定义:

template<typename _InputIterator, typename _Predicate>
inline _InputIterator
find_if_not(_InputIterator __first, _InputIterator __last,
    _Predicate __pred)
{
  // concept requirements
  __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
  __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
      typename iterator_traits<_InputIterator>::value_type>)
  __glibcxx_requires_valid_range(__first, __last);
  return std::__find_if_not(__first, __last, __pred);
}

似乎返回类型应该与参数相同。但是为什么编译器会这么抱怨?如何解决这个错误?Thx。

2 个答案:

答案 0 :(得分:4)

std::vector<int>::iterator
find_first_bigger(const std::vector<int> &v, const std::string &s);
                   ^^

你的矢量是常量。所以你会得到一个std::vector<int>::const_iterator。 如果不是const,你会得到一个std::vector<int>::iterator

答案 1 :(得分:3)

注意

//...
inline _InputIterator
find_if_not(_InputIterator __first, _InputIterator __last,
    _Predicate __pred)
//...

返回它作为参数接收的相同类型的迭代器。

由于您通过const std::vector<int> &v,因此必须返回const_iterator

std::vector<int>::const_iterator
find_first_bigger(const std::vector<int> &v, const std::string &s);