c++ - 通过迭代器获取 vector 中的索引

标签 c++ vector iterator

我正在尝试获取迭代器指向的元素的索引。

struct job{
    int start_time;
    int finish_time;
    int profit;
};


int latest_non_conflicting_job(std::vector<job>& vec, std::vector<job>::size_type& i)
{
    for(std::vector<job>::reverse_iterator it = vec.rbegin()-i; it != vec.rend(); it++){

                if(*it.finish_time <= vec[i].start_time){
                return it-vec.begin();
            }
    }

    return -1;
}

int main()
    {
        std::vector<job> vec = {{3, 10, 20}, {1, 2, 50}, {6, 19, 100}, {2, 100, 200}};
        latest_non_conflicting_job(vec, vec.size());
        return 0;
    }

它告诉我错误:

error: no match for 'operator-' (operand types are 'std::vector<job>::reverse_iterator {aka std::reverse_iterator<__gnu_cxx::__normal_iterator<job*, std::vector<job> > >}' and 'std::vector<job>::iterator {aka __gnu_cxx::__normal_iterator<job*, std::vector<job> >}')

如果我理解正确的话,因为我的 vector 包含“作业”类型的元素,所以我需要重载 -operator 才能工作。

我知道的一种方法是我可以通过索引遍历 vector 来获得我的结果。

有没有其他方法可以让我在不重载运算符的情况下通过迭代器获取元素点的索引? 它仍然是一个相当不完善的代码,因为我还不太擅长迭代器和 vector ,所以请忽略它。

最佳答案

不,您不必实现任何运算符。问题在于您使用了两种不同类型的迭代器,iteratorreverse_iterator。您始终可以使用 base() 访问指向下一个元素的 normal iterator

return it.base() - vec.begin() - 1;

关于c++ - 通过迭代器获取 vector 中的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57947937/

相关文章:

c++ - 枚举的命名空间问题

c++ - 在声明 c++ 之后给出的维度

c++ - 如果私有(private)变量匹配,则从 vector 中删除对象

c++ - 映射、迭代器和复杂结构 - STL 错误

java.util.ConcurrentModificationException 和迭代?

可通过迭代器和索引访问的 Python 类

c++ - 使用 decltype 返回元素类型的元函数

c++ - 使用 C++ 开始 Direct X 的好书或教程

c++ - 为什么将函数转换为除返回类型外相同的函数类型会失败?

c++ - 如何在 FFMPEG 中填充/计算 motion_val?