gpt4 book ai didi

c++ - 类成员 vector 上的迭代器未正确取消引用

转载 作者:太空狗 更新时间:2023-10-29 21:04:08 26 4
gpt4 key购买 nike

我有一个名为 Domain 的类,它有一个名为 std::vector 的 protected 成员itsVec。该 vector 可通过 getVec() 访问。

main() 中,当我通过getVec()[我]。但是,当我尝试使用迭代器时,指向第一个的指针元素似乎没有正确初始化。奇怪的是,在类构造函数中的 itsVec 上使用迭代器就像一个魅力。

代码

#include<iostream>
#include <vector>

class Domain
{
public:
/* ==================== LIFECYCLE ======================================= */
Domain ( ) {}; /* constructor */
Domain ( unsigned int , const unsigned int * ) ; /* custom constructor */
Domain ( const Domain &other ); /* copy constructor */
~Domain ( ) {}; /* destructor */

/* ==================== ACCESSORS ======================================= */
unsigned int getDim() const {return itsDim;}
std::vector<unsigned int> getVec() const {return itsVec;}

protected:
/* ==================== DATA MEMBERS ======================================= */
unsigned int itsDim;
std::vector<unsigned int> itsVec;

}; /* ----- end of class Domain ----- */


Domain::Domain( unsigned int dim, const unsigned int *externVec)
{
itsDim = dim;

for ( size_t j = 0; j < dim ; j++ )
itsVec.push_back(externVec[j]);

std::vector<unsigned int>::const_iterator i_vec = itsVec.begin();

// iterator access works
for ( ; i_vec != itsVec.end(); i_vec++)
std::cout<<"Iterator in constructor: " << (*i_vec) << std::endl;

std::cout<<std::endl;

} /* ----- end of constructor ----- */


/*-----------------------------------------------------------------------------
* Main
*-----------------------------------------------------------------------------*/
int main ()
{
const unsigned int kVec[3] = { 1, 2, 3 };

Domain k(3,kVec);

size_t i = 0;

// direct access works
for( ; i<3 ; i++)
std::cout << "Vec direct: " << k.getVec()[i] << std::endl;

std::cout << std::endl;

// iterator access FAILS for the first element
std::vector<unsigned int>::const_iterator it_vec = k.getVec().begin();

for ( ; it_vec != k.getVec().end(); it_vec++)
std::cout<<"Vec iterator " << (*it_vec) << std::endl;

return 0;
} /* ---------- end of function main ---------- */

g++ main.cc -o test编译结果

$ ./test

Iterator in constructor: 1
Iterator in constructor: 2
Iterator in constructor: 3

Vec direct: 1
Vec direct: 2
Vec direct: 3

Vec iterator 140124160
Vec iterator 2
Vec iterator 3

在另一台机器上测试给出:

Vec iterator 0
Vec iterator 0
Vec iterator 3

我通过 getVec() 返回 vector 的方式是错误的吗?是个迭代器处理不正确?我不知道这里出了什么问题或如何解决它。

非常感谢任何帮助,

达弗伦克

最佳答案

您返回的是 vector 的拷贝而不是引用,因此您没有正确匹配迭代器。您从 begin() 获得的迭代器与您从 end()

获得的内部 vector 拷贝不同

您可以通过将函数原型(prototype)更改为以下方式来返回引用,而不是返回内部 vector 的拷贝:

const std::vector<unsigned int>& getVec() const {return itsVec;}

关于c++ - 类成员 vector 上的迭代器未正确取消引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12141612/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com