Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从结束到某处迭代向量(不是开始)_C++_Iterator - Fatal编程技术网

C++ 从结束到某处迭代向量(不是开始)

C++ 从结束到某处迭代向量(不是开始),c++,iterator,C++,Iterator,我试图使用rbegin()和来自std::find_if()的迭代器来迭代std::vector。当然,iterator和reverse\u iterator是不兼容的。我怎么做 auto my_it = std::find_if(vec.begin(), vec.end(), // irrelevant lambda }); for (auto rit = vec.rbegin(); rit != my_it; ++rit) // doesn't compile, iterat

我试图使用
rbegin()
和来自
std::find_if()
的迭代器来迭代
std::vector
。当然,
iterator
reverse\u iterator
是不兼容的。我怎么做

auto my_it = std::find_if(vec.begin(), vec.end(), 
    // irrelevant lambda
});

for (auto rit = vec.rbegin(); rit != my_it; ++rit)   // doesn't compile, iterators not compatible
{
    // do something
}
关于如何从
rbegin()
迭代到
rend()
,有很多问题,但是我找不到任何关于何时在
rend()
之前停止的问题。您可以使用
std::reverse\u iterator
的函数访问底层的“正常”迭代器:

for (auto rit = vec.rbegin(); 
     rit != std::vector<int>::reverse_iterator(my_it); 
     ++rit) {
    // ...
}
for(auto rit=vec.rbegin();
rit!=std::vector::reverse\u迭代器(my\u it);
++(rit){
// ...
}
您可以使用
std::reverse_iterator
的函数访问底层的“普通”迭代器:

for (auto rit = vec.rbegin(); 
     rit != std::vector<int>::reverse_iterator(my_it); 
     ++rit) {
    // ...
}
for(auto rit=vec.rbegin();
rit!=std::vector::reverse\u迭代器(my\u it);
++(rit){
// ...
}

这是一个演示程序

#include <iostream>
#include <algorithm>
#include <vector>

int main()
{
    std::vector<int> v = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

    auto it = std::find( v.begin(), v.end(), 5 );

    if ( it != v.end() )
    {        
        std::vector<int>::reverse_iterator last( it );

        for ( auto first = v.rbegin(); first != last; ++first ) std::cout << *first << ' ';
        std::cout << std::endl;
    }       
}    
如果不希望将找到的迭代器包含在范围内,则可以编写

std::vector<int>::reverse_iterator last( ++it );
std::vector::reverse_迭代器last(++it);

这是一个演示程序

#include <iostream>
#include <algorithm>
#include <vector>

int main()
{
    std::vector<int> v = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

    auto it = std::find( v.begin(), v.end(), 5 );

    if ( it != v.end() )
    {        
        std::vector<int>::reverse_iterator last( it );

        for ( auto first = v.rbegin(); first != last; ++first ) std::cout << *first << ' ';
        std::cout << std::endl;
    }       
}    
如果不希望将找到的迭代器包含在范围内,则可以编写

std::vector<int>::reverse_iterator last( ++it );
std::vector::reverse_迭代器last(++it);

您可以将任一类型的迭代器转换为另一种类型。正如WhozCraig所建议的,您可以使用rbegin()和rend()运行算法

如果这不是一个选项,您可以获得:


您可以将任一类型的迭代器转换为另一种类型。正如WhozCraig所建议的,您可以使用rbegin()和rend()运行算法

如果这不是一个选项,您可以获得:


好主意,但弗拉德的解决方案更通用。好主意,但弗拉德的解决方案更通用。