如何在 c++ 中访问一对迭代器的开头

How to access the beginning of an iterator in a pair in c++

本文关键字:迭代器 开头 访问 c++      更新时间:2023-10-16

我有一对有 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)))

错误:

错误:调用没有匹配函数 'begin(std::p air<__gnu_cxx::__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

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

提到教授措辞的评论表明,教授正在应用一种约定,即T是迭代器类型的std::pair<T,T>指定一个范围,其中对的第一个元素是范围的开头,第二个元素是结束。这很好,但它与beginend的功能没有内在联系。

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

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