【问题标题】:How to access the beginning of an iterator in a pair in c++如何在c ++中访问一对迭代器的开头
【发布时间】:2017-02-05 19:47:08
【问题描述】:

我有一对有 2 个迭代器,即:

auto trim = make_pair <std::string::iterator, std::string::iterator>

我正在尝试将第一个迭代器的开头与第二个迭代器的结尾进行比较。

我想出了这行代码,但它不正确,因为程序无法编译:

if (begin(trim).first == end(trim).second)

我也试过这行代码,但还是报错

if (begin(get<0>(trim)) == end(get<1>(trim)))

错误:

错误:没有匹配的调用函数 '开始(std::pair<:__normal_iterator>, __gnu_cxx::__normal_iterator > >&)'

if (begin(trim).first == end(trim).second)

          ^

完整示例:

auto func(std::string& str, TrimPredicate p) ->
std::pair<
std::string::iterator,  // typedef to string iterator type
std::string::iterator   // typedef to string iterator type
>
{
// Do stuff and return them as below
return std::make_pair(first_non_ws_iter, last_non_ws_iter);

}

auto func2()-> std::pair<bool, string> {

 auto trimmed_range = func(
                                       line,
                                       [loc](auto char_var)
                                       {
                                        return isspace(char_var, loc);
                                       }
                                       );


  if (begin(trimmed_range).first == end(trimmed_range).second)
            //do something

【问题讨论】:

  • 迭代器没有开始和结束。
  • 您能否提供更多关于您为什么要这样做的背景信息,也许还有一个简短的完整示例?有点像 XY 问题。
  • @NeilButterworth 对不起,这里是 C++ 新手,但是教授要求我们写这行代码:if the trim's "begin" (first) iterator is equal to trims "end" (second) iterator, then loop (i.e., continue). 所以我现在真的很困惑
  • @RetiredNinja,我会更新问题
  • 所以你会想要这样的东西:if (trim.first == trim.second)

标签: c++ c++14


【解决方案1】:

迭代器成对工作以指定范围。范围有开始和结束。容器是创建范围的最常用方法之一;容器具有名为begin()end() 的成员函数,它们分别返回指向容器内容开头和结尾的迭代器。 C++ 标准库还提供了免费函数std::beginstd::end,可应用于容器和数组以获取开始和结束迭代器。

提到教授措辞的评论表明教授正在应用一个约定std::pair&lt;T,T&gt; 其中T 是一个迭代器类型指定一个范围,该对的第一个元素是范围的开始,第二个元素是结束。这很好,但它与函数beginend 没有内在联系。

因此,从该对中获取开始和结束迭代器的方法就是访问该对的元素:

if (trimmed_range.first == trimmed_range.second)
    // do something

【讨论】:

    猜你喜欢
    • 2017-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-23
    • 2011-10-21
    • 2013-01-05
    • 2017-04-29
    相关资源
    最近更新 更多