C++关于迭代std::vector的问题



我的问题("为什么它不起作用?")涉及下面的小样本。

当我运行这个(g++ testThis.cc -o testThis之后)时,我得到:

printing 101
printing 102
printing 103
printing 100
printing 100
printing -1021296524

这应该不是myHolder超出范围的问题,那么为什么要制作向量本身的本地副本呢?

它应该在课堂上保持舒适。

#include <vector>
#include <iostream>
class stdHolder {
public:
stdHolder();
std::vector<int> getSV() const {return _myVector;}
private:
std::vector<int> _myVector;
};
stdHolder::stdHolder() {
_myVector.push_back(1);
_myVector.push_back(2);
_myVector.push_back(3);
}
int main() {
stdHolder myHolder;
// the following works
std::vector<int> localSV = myHolder.getSV();
for (std::vector<int>::iterator it = localSV.begin(); it != localSV.end(); it++ ) {
std::cout << "printing " << *it + 100 << std::endl;
}
//return 0; // comment this line to see my problem
// the following loops forever
for (std::vector<int>::iterator it = myHolder.getSV().begin(); it != myHolder.getSV().end(); it++ ) {
std::cout << "                                 printing " << *it + 100 << std::endl;
}
return 0;

我的问题("为什么它不起作用?

因为myHolder.getSV().begin()myHolder.getSV().end()在不同的向量上工作,因为你调用成员函数stdHolder::getSV()两次,并且每次调用都会返回一个不同的向量(因为你按返回一个向量)。

也就是说,迭代器it是用myHolder.getSV().begin()初始化的,但随后您将it(双关语)与myHolder.getSV().end()的结果进行比较,是调用myHolder.getSV()返回的完全不同的向量的迭代器。


解决此问题的一种方法是通过常量引用返回向量。这样,第一个循环将从返回值复制,而第二个循环将正常工作,因为它将从同一向量数据成员中获取迭代器。请注意,如果您使用它,那么对于第二个循环,您必须it设为const_iterator

请参阅以下修改程序中的注释:

class stdHolder {
public:
stdHolder();
//-----------------------v---------------------------------->return by const lvalue reference
const std::vector<int> &getSV() const {return _myVector;}
private:
std::vector<int> _myVector;
};
stdHolder::stdHolder() {
_myVector.push_back(1);
_myVector.push_back(2);
_myVector.push_back(3);
}
int main() {
stdHolder myHolder;
//still works 
std::vector<int> localSV = myHolder.getSV();
for (std::vector<int>::iterator it = localSV.begin(); it != localSV.end(); it++ ) {
std::cout << "printing " << *it + 100 << std::endl;
}
//this works too now
//---------------------vvvvvvvvvvvvvv--------------------------------------->const_iterator used instead of iterator
for (std::vector<int>::const_iterator it = myHolder.getSV().begin(); it != myHolder.getSV().end(); it++ ) {
std::cout << "                                 printing " << *it + 100 << std::endl;
}
return 0;
}

其他选项是只为您的stdHolder添加beginend成员函数,然后您就可以使用基于范围的 for 循环

最新更新