繁体   English   中英

为什么我不能在范围-v3中获得范围的大小?

[英]Why couldn't I get the size of a range in range-v3?

我想得到名字以'T'开头的人数:

#include <iostream>
#include <string>
#include <range\v3\all.hpp>

using namespace ranges;

int main()
{
    const auto names = std::vector<std::string> {"Tony", "Peter"};

    std::cout << size(names | view::filter([](const auto& s) {return s[0] == 'T';}));
}

但我得到了巨大的编译错误:

λ clang -std=c++14 test.cpp
test.cpp:11:18: error: no matching function for call to object of type 'const ranges::v3::adl_size_detail::size_fn'
std::cout << size(names | view::filter([](const auto& s) {return s[0] == 'T';}));
             ^~~~
K:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\range/v3/size.hpp:90:32: note: candidate template
  ignored: substitution failure [with Rng =
  ranges::v3::remove_if_view<ranges::v3::iterator_range<std::_Vector_const_iterator<std::_Vector_val<std::_Simple_types<std::basic_string<char,
  std::char_traits<char>, std::allocator<char> > > > >,
  std::_Vector_const_iterator<std::_Vector_val<std::_Simple_types<std::basic_string<char, std::char_traits<char>,
  std::allocator<char> > > > > >, ranges::v3::logical_negate<(lambda at test.cpp:11:44)> >]: no matching function
  for call to 'size'
            constexpr auto operator()(Rng &&rng) const ->
                           ^
K:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\range/v3/utility/iterator.hpp:405:32: note: candidate
  function template not viable: requires 2 arguments, but 1 was provided
        iterator_size_t<I> operator()(I begin, S end) const

顺便说一下,我在Visual Studio 2015 Update 1中使用了clang 3.7。那么,有什么问题?

使用distance ,而不是size 后者用于可以在恒定时间内检索其大小的范围。

你最好使用count_if算法。

auto cnt = ranges::count_if( names, [](const auto& s) {return s[0] == 'T';} )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM