如何在 c++ 中访问一对迭代器的开头
How to access the beginning of an iterator in a pair in c++
我有一对有 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::begin
和std::end
。
提到教授措辞的评论表明,教授正在应用一种约定,即T
是迭代器类型的std::pair<T,T>
指定一个范围,其中对的第一个元素是范围的开头,第二个元素是结束。这很好,但它与begin
和end
的功能没有内在联系。
因此,从该对中获取开始和结束迭代器的方法只是访问该对的元素:
if (trimmed_range.first == trimmed_range.second)
// do something
相关文章:
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++中带有List类的迭代器Segfault
- 如何在c++迭代器类型中包装std::chrono
- 集合上的输出迭代器:assign和increment迭代器
- Boost Spirit,获取迭代器内部语义动作
- 对于set上的循环-获取next元素迭代器
- 为什么output_editor Concept不需要output_e迭代器标记
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 使用迭代器时如何访问对象在向量中的位置?
- std::vector::迭代器是否可以合法地作为指针
- 跟随整数索引列表的自定义类迭代器
- 不明白迭代器,引用和指针失效,一个例子
- 我可以使用反向迭代器作为ForwardIt吗
- ESP8266单片机矢量迭代器的C++问题
- 当通知迭代器参数初始化为空列表的开头时,list::insert 行为是什么?
- 如何在 c++ 中访问一对迭代器的开头
- 为什么迭代器不返回集合的开头
- 迭代器回到递归方法的开头
- 我怎么知道迭代器的自减量超过了向量的开头