Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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++;STL向量迭代器到向量反向迭代器? 我使用了嵌套 < /COD> >循环,在C++ STL 上进行插入排序。-循环的第一个在迭代器上,第二个在反向itr上_C++_Sorting_Stl_Iterator_Insertion Sort - Fatal编程技术网

如何转换C++;STL向量迭代器到向量反向迭代器? 我使用了嵌套 < /COD> >循环,在C++ STL 上进行插入排序。-循环的第一个在迭代器上,第二个在反向itr上

如何转换C++;STL向量迭代器到向量反向迭代器? 我使用了嵌套 < /COD> >循环,在C++ STL 上进行插入排序。-循环的第一个在迭代器上,第二个在反向itr上,c++,sorting,stl,iterator,insertion-sort,C++,Sorting,Stl,Iterator,Insertion Sort,我需要将索引(迭代器指针值)从第一个循环传递到第二个循环。我尝试了以下方法,但它给了我这个错误 error: no match for ‘operator!=’ (operand types are ‘__gnu_cxx::__normal_iterator<int*, std::vector<int> >’ and ‘std::vector<int>::reverse_iterator’ {aka ‘std::reverse_iterator<_

我需要将索引(迭代器指针值)从第一个循环传递到第二个循环。我尝试了以下方法,但它给了我这个错误

error: no match for ‘operator!=’ (operand types are 
‘__gnu_cxx::__normal_iterator<int*, std::vector<int> >’ and 
‘std::vector<int>::reverse_iterator’ {aka 
‘std::reverse_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> > >’})
错误:与“operator!=”不匹配(操作数类型为
“_gnu_cxx::_normal_iterator”和
'std::vector::reverse_迭代器'{aka]
'std::reverse_iterator'})
void insertionSort(整数大小,向量arr){
对于(自动itr=arr.begin();itr!=arr.end()-1;++itr){
int元素=*(itr+1);

cout尝试将其更改为(vector::reverse_iterator r_itr(next(itr));r_itr!=arr.rend();++r_itr)

为了扩展其工作范围,
反向迭代器
的实现方式与
迭代器
不同。
迭代器
的逻辑和物理地址相同,但对于
反向迭代器
,逻辑和物理地址不相同。例如:
s.end()
s.rbegin()
具有相同的物理地址,但
*s.end()
将给您一个错误,但
*s.rbegin()
将给您容器的最后一个值
s

下面的代码将使事情变得清楚:

#include <iostream>
#include <set>

using namespace std;

int main()
{
    set<int> S{ 1, 2, 3 };
    
    set<int>::iterator itr = S.find(2);
    cout << *itr << endl;

    set<int>::reverse_iterator r_itr(itr);
    cout << *r_itr << endl;

    cout << itr._Ptr << ' ' << r_itr.base()._Ptr << endl;

    //S.erase(r_itr);       // ERROR!
    S.erase(r_itr.base());

    for (int e : S)
        cout << e << ' ';
}

尝试将其更改为(vector::reverse_iterator r_itr(next(itr));r_itr!=arr.rend();++r_itr)

为了扩展其工作范围,
反向迭代器
的实现方式与
迭代器
不同。
迭代器
的逻辑和物理地址相同,但对于
反向迭代器
,逻辑和物理地址不相同。例如:
s.end()
s.rbegin()
具有相同的物理地址,但
*s.end()
将给您一个错误,但
*s.rbegin()
将给您容器的最后一个值
s

下面的代码将使事情变得清楚:

#include <iostream>
#include <set>

using namespace std;

int main()
{
    set<int> S{ 1, 2, 3 };
    
    set<int>::iterator itr = S.find(2);
    cout << *itr << endl;

    set<int>::reverse_iterator r_itr(itr);
    cout << *r_itr << endl;

    cout << itr._Ptr << ' ' << r_itr.base()._Ptr << endl;

    //S.erase(r_itr);       // ERROR!
    S.erase(r_itr.base());

    for (int e : S)
        cout << e << ' ';
}

类模板
std::vector
具有随机访问迭代器。因此,不需要将给定的“正向”迭代器转换为“反向”迭代器

只需在迭代器中使用
运算符--
而不是
运算符+++
,或者在需要时使用
运算符

请注意,参数
size
未在声明的函数中使用

void insertionSort(int size, vector<int> arr);

类模板
std::vector
具有随机访问迭代器。因此,不需要将给定的“正向”迭代器转换为“反向”迭代器

只需在迭代器中使用
运算符--
而不是
运算符+++
,或者在需要时使用
运算符

请注意,参数
size
未在声明的函数中使用

void insertionSort(int size, vector<int> arr);

您将使用您的代码(在
*(itr+1)
*(r\u itr+1)
)取消对
结束
迭代器的引用。您将使用您的代码(在
*(itr+1)
*(r\u itr+1)
取消对
结束
迭代器的引用。然后只需通过
*r\u itr
访问元素。这将第一次为您提供
*itr
之前的元素。是的,我意识到不需要使用变量来获取元素。我的smol大脑哈哈。该死,您一直在编辑您的答案,我不得不一遍又一遍地阅读,我已经看到了许多代码示例,它们都是我们使用的e范围解析操作符
::
而不是直接使用类或函数。为什么这样做?为什么还要使用set::iterator itr=S.find(2),而你可以简单地说auto itr=S.find(2)?@louis.shawn我这样做是为了清楚。但是在for循环中,你需要使用范围解析方法作为auto r_itr(itr)也可能意味着你只是将
itr
这是一个
迭代器
复制到
r\u itr
中,后者既可以是
iterator
也可以是
reverse\u iterator
。希望你理解,但英语不是很好。只需通过
*r\u itr
访问元素。这将为你提供
*itr
之前的元素第一次。是的,我意识到没有必要使用变量来获取元素。我的smol大脑哈哈。该死,你一直在编辑你的答案,我不得不一遍又一遍地阅读。我看到许多代码示例,其中他们使用范围解析操作符
,而不是直接使用类或函数。为什么这样做?also为什么要使用set::iterator itr=S.find(2),而你可以简单地说auto itr=S.find(2)?@louis.shawn我这样做是为了弄清楚。但是在for循环中,你需要使用范围解决方法作为auto r_itr(itr)也可能意味着你只是把
itr
这是一个
迭代器
复制到
r\u itr
这两个迭代器都可以是
iterator
reverse\u迭代器
。希望你能理解,英语不是很好。我对
iterator
reverse迭代器非常兴奋(我刚开始用C++编码,我主要使用C或Python),我忘记了使用<代码>的基本逻辑-ITR 。我被淹没了!我对“代码>迭代器< /C>和<代码>反向迭代器< />(我刚开始用C++编码,我主要使用C或Python)感到兴奋不已。,我忘记了使用
--itr
的基本逻辑。我不知所措!
void insertionSort( std::vector<int>::iterator first, std::vector<int>::iterator last );
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
#include <cstdlib>
#include <ctime>

void insertionSort( std::vector<int>::iterator first, std::vector<int>::iterator last )
{
    if ( first != last )
    {
        for ( auto current = first; ++current != last; )
        {
            typename std::iterator_traits<decltype( current )>::value_type
                value( *current );

            auto prev = current, next = current;

            while ( next != first && value < *--prev )
            {
                *next-- = *prev;
            }

            if ( next != current ) *next = value;
        }
    }
}

int main() 
{
    std::vector<int> v;
    const int N = 10;
    
    std::srand( ( unsigned int )std::time( nullptr ) );
    
    std::generate_n( std::back_inserter( v ), N, [=]{ return std::rand() % N; } );
    
    for ( const auto &item : v )
    {
        std::cout << item << ' ';
    }
    std::cout << '\n';
    
    insertionSort( std::begin( v ), std::end( v ) );
    
    for ( const auto &item : v )
    {
        std::cout << item << ' ';
    }
    std::cout << '\n';
    
    return 0;
}
0 6 6 7 4 3 4 6 6 1 
0 1 3 4 4 6 6 6 6 7