如何转换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