向量迭代器类型未知

Posted

技术标签:

【中文标题】向量迭代器类型未知【英文标题】:Vector iterator type unknown 【发布时间】:2019-07-25 16:23:04 【问题描述】:

我正在学习 C++,这是我第一次使用迭代器

我已经写下了这段代码:

std::pair<max, max> ConvertToAStarMap::GetLimits(std::string map)

    // Init max and min variables.
    int max_x = std::numeric_limits<int>::min();
    int min_x = std::numeric_limits<int>::max();

    int max_y = max_x;
    int min_y = min_x;

    std::vector<std::string> map_cells = ConvertToAStarMap::split(map, ';');

    for (std::string::iterator it = map_cells.begin(); it != map_cells.end(); ++it)

我得到这个错误:

ConvertToAStarMap.cpp: In member function ‘std::pair<max, max> ConvertToAStarMap::GetLimits(std::__cxx11::string)’:
ConvertToAStarMap.cpp:31:52: error: conversion from ‘std::vector<std::__cxx11::basic_string<char> >::iterator aka __gnu_cxx::__normal_iterator<std::__cxx11::basic_string<char>*, std::vector<std::__cxx11::basic_string<char> > >’ to non-scalar type ‘std::__cxx11::basic_string<char>::iterator aka __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >’ requested
     for (std::string::iterator it = map_cells.begin(); it != map_cells.end(); ++it)
                                     ~~~~~~~~~~~~~~~^~
ConvertToAStarMap.cpp:31:59: error: no match for ‘operator!=’ (operand types are ‘std::__cxx11::basic_string<char>::iterator aka __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >’ and ‘std::vector<std::__cxx11::basic_string<char> >::iterator aka __gnu_cxx::__normal_iterator<std::__cxx11::basic_string<char>*, std::vector<std::__cxx11::basic_string<char> > >’)
     for (std::string::iterator it = map_cells.begin(); it != map_cells.end(); ++it)
                                                        ~~~^~~~~~~~~~~~~~~~~~

怎么了?没看懂。

【问题讨论】:

@NathanOliver 我知道这是初学者的错误,但这是一个有效且表述良好的问题。我认为 OP 应该得到一个正确的答案,对于有经验的 C++ 程序员来说,回答这个问题尽可能简单。 我不认为这是一个错字。这个问题来自对向量的迭代器类型如何工作的误解,初学者很容易发生这种情况(尤其是 C++ 的冗长迭代器类型)。拼写错误是一个简单的语法错误。 @VansFannel Meta 帖子与此问题相关; meta.***.com/questions/387751/…(不要指望反对票的答案) 【参考方案1】:

最简单的做法是:

for (const auto& cell : map_cells)

如果您不想使用基于范围的 for 循环:

for (auto it = map_cells.begin();......

问题是你想遍历向量,而不是字符串,所以应该是:

for (std::vector<std::string>::iterator it = map_cells.begin();......

此信息可在第 2 点的错误中找到。:

    错误:转换自 ‘std::vector&lt;std::__cxx11::basic_string&lt;char&gt; &gt;::iterator 又名__gnu_cxx::__normal_iterator&lt;std::__cxx11::basic_string&lt;char&gt;*, std::vector&lt;std::__cxx11::basic_string&lt;char&gt; &gt; &gt;' 转为非标量类型 ‘std::__cxx11::basic_string&lt;char&gt;::iterator 又名__gnu_cxx::__normal_iterator&lt;char*, std::__cxx11::basic_string&lt;char&gt; &gt;'

【讨论】:

我想补充一点,std::__cxx11::basic_string&lt;char&gt; 只是 std::string 的完整类型,因此简化的错误消息将是 error: conversion from ‘std::vector&lt;std::string&gt;::iterator’ to non-scalar type ‘std::string::iterator'... 错误消息是最糟糕的消息之一C++的一部分:(

以上是关于向量迭代器类型未知的主要内容,如果未能解决你的问题,请参考以下文章

使用迭代器 C++ 删除对象类型的向量元素

从不同类型容器的迭代器初始化向量

练笔-字符串,向量和数组6

如何在迭代器中正确引用第一个向量容器?

使用向量迭代器时的 EXC_BAD_ACCESS?

性能 - 使用迭代器或指针迭代向量?