【问题标题】:How to compute distance between std::vector<int>::iterator and std::vector<int>::reverse_iterator?如何计算 std::vector<int>::iterator 和 std::vector<int>::reverse_iterator 之间的距离?
【发布时间】:2017-04-16 16:26:43
【问题描述】:

我尝试像这样使用 std::distance :

vi::iterator frontIter = resVec.begin();
vi::reverse_iterator backIter = resVec.rbegin();    

if(std::distance(frontIter , backIter))
{
    std::cout << " ! " << std::endl;
}

但是编译器给了我这个错误。

partion.cpp:46:39: note: candidate is:
In file included from /usr/include/c++/4.9/bits/stl_algobase.h:66:0,
                 from /usr/include/c++/4.9/vector:60,
                 from test.h:1,
                 from partion.cpp:1:
/usr/include/c++/4.9/bits/stl_iterator_base_funcs.h:114:5: note: template<class _InputIterator> typename std::iterator_traits<_Iterator>::difference_type std::distance(_InputIterator, _InputIterator)
     distance(_InputIterator __first, _InputIterator __last)
     ^
/usr/include/c++/4.9/bits/stl_iterator_base_funcs.h:114:5: note:   template argument deduction/substitution failed:
partion.cpp:46:39: note:   deduced conflicting types for parameter ‘_InputIterator’ (‘__gnu_cxx::__normal_iterator<int*, std::vector<int> >’ and ‘std::reverse_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> > >’)
  if(std::distance(frontIter , backIter))

那么我如何找到这两个迭代器之间的距离。更好的是,有没有办法在不使用 back_iterator 而是使用两个标准迭代器的情况下解决这个问题?

for(size idx = 0 ; idx < vec.size() ; ++idx)
{
    if(idx == n) 
    {
        continue;
    }   

    if(vec[idx] < partVal) // insert in front of  partVal
    {

        *frontIter = vec[idx];
        ++frontIter;    
    }
    else // insert at back of n
    {
        *backIter = vec[idx];   
        ++backIter;
    }

}

注意:

using vi = std::vector<int>;
using size = std::size_t;

【问题讨论】:

    标签: c++ c++11 pointers vector iterator


    【解决方案1】:

    任何reverse iterator 都可以通过base() 转换为其底层的前向迭代器。

    所以你想要的是:

    std::distance(v.begin(), v.rbegin().base())
    

    这将为您提供与v.size() 相同的结果。

    【讨论】:

    • 我是否正确使用了迭代器? *迭代器。有没有更好的方法在迭代器的位置插入一个值。向量成员 insert 不接受 reverese_iterator。也许我可以使用 base 将 rev iter 转换为 iter。谢谢
    • @nnrales 我不知道你的代码片段在做什么。您的问题没有上下文,也不是完整的示例。
    • 也许我应该创建一个不同的问题,但是当我这样做时 resVec.insert(frontIter , vec[idx]);而不是 *frontIter = vec[idx];我遇到了段错误。
    猜你喜欢
    • 2020-01-26
    • 2017-02-01
    • 2021-08-26
    • 2017-07-03
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多