C++中的向量迭代器

Posted

技术标签:

【中文标题】C++中的向量迭代器【英文标题】:vector iterator in c++ 【发布时间】:2012-08-13 14:49:17 【问题描述】:

我正在尝试使用迭代器在 c++ 中遍历 vector<char*>。我已经构建了一个虚拟程序,它应该从末尾开始,在数字 >0 上后退(朝向开头,或 rend()),在数字 rbegin()) 0,并在 0 处退出。如果迭代器已到达任一端并且用户尝试进一步前进,它应该在该端重复元素并且不移动迭代器。我的问题是,如果用户试图跑到最后,而不是这样做,我只会得到一个段错误。这是我的代码:

#include <iostream>
#include <vector>
#include <stdio.h>

using namespace std;

int main()
    vector<char*> vect;
    char* tmp;
    for (int i=1; i<=5; i++)
        tmp = new char[7];
        sprintf(tmp, "hello%d", i);
        vect.push_back(tmp);
    

    vector<char*>::const_reverse_iterator it = vect.rbegin();

    int a;
    cin >> a;

    while (a!=0)
        if (a>0)
            if (it < vect.rend())
                cout << *(++it) << endl;
             else
                cout << *it << endl;
            
         else
            if (it > vect.rbegin())
               cout << *(--it) << endl;
             else
                cout << *it << endl;
            
        
        cin >> a;
    

    return 0;

谁能找出问题所在?

编辑

我忘了我做了一个小改动。我之前的代码在初始化 for 循环中没有填充 tmp。已经修复了

【问题讨论】:

您知道该代码中存在内存泄漏,对吧? 是的,我看到了,但这并不重要,因为这只是虚拟代码 【参考方案1】:

问题在于rend 迭代器将一项指向序列的(反向)结尾。取消引用它会导致段错误:

    if (it < vect.rend())
        cout << *(++it) << endl;
     else
        cout << *it << endl;    // <---- segfault
    

一个最小的修复可能是

if (it+1 < vect.rend())

    cout << *(++it) << endl;
 else
    cout << *it << endl;   

【讨论】:

这是正确的,但是从不经意的一瞥代码中很难确切地看到 在哪里 rend() 正在被取消引用。建议的行应替换 if(it &lt; vect.rend()) @Chad:谢谢,我加了澄清【参考方案2】:

由于目标实际上是不使用过去的结束位置,所以我重新定义了问题:它需要两个迭代器,一个指向所需范围内的第一个元素,一个指向最后一个一。然后机制变得简单:

if (it != end)
    ++it;
cout << *it << endl;

同样,往另一个方向发展:

if (it != begin)
    --it;
cout << *it << endl;

开始和结束的定义如下:

typedef vector<char*>::reverse_iterator iter;
iter begin = vect.rbegin();
iter end = --vect.rend();  // assumes that vect is not empty

【讨论】:

以上是关于C++中的向量迭代器的主要内容,如果未能解决你的问题,请参考以下文章

迭代器可以在 C++ 中的向量之间共享吗?

向量迭代器不可取消引用 C++

对于 C++ Random Access Iterator(向量迭代器),迭代器之间的差异是如何计算的?

for 循环中的向量迭代器、返回语句、警告、c++

C++:在开始之前不能寻找向量迭代器

使用迭代器查找向量的中间元素 - C++