如何从 STL 列表中的迭代器访问指向结构的指针而不是其元素
Posted
技术标签:
【中文标题】如何从 STL 列表中的迭代器访问指向结构的指针而不是其元素【英文标题】:How do I access pointer to Structure instead of its elements from iterator in STL list 【发布时间】:2016-02-14 14:26:36 【问题描述】:我有以下形式的结构
class THistory
/* */
public:
UInt32 userId;
UInt32 trip;
;
列表如下
THistory hist2;
std::list<THistory> temp;
std::list<THistory>::iterator it = temp.begin();
hist2.userId=userId;//passed by some function storing in tempory structure
hist2.trip=trip;//passed by some function storing in tempory structure
temp.push_back(hist2);//Pusing into list
我的问题是我可以访问
it->userId and
it->trip
但是我如何访问整个结构。我需要将整个结构指针传递给其他函数而不是单个元素。另外,在推入列表之前使用临时结构填充结构元素的上述方法是否正确。
根据答案更新: 我按如下方式传递迭代器
getLocations(&*it);
定义:
getLocations( THistory *hist)
////
我的代码可以编译,但在运行时崩溃
“错误:Iterator is deferencable”我进入函数内部,它在库内部调用列表函数并在此处崩溃
reference operator*() const
// return designated value
return ((reference)**(_Mybase *)this);
我越来越糊涂了。希望这不是愚蠢的错误
【问题讨论】:
"但是我如何访问整个结构。"(*it)
请创建一个Minimal, Complete, and Verifiable Example 并展示给我们。
std::list<THistory>::iterator it = temp.begin();
- 嗯...查看您的代码,nothing 那时在列表中,对吗?该迭代器不会神奇地开始指向您在获取它之后插入的内容。
是的,我错过了... thnx..
【参考方案1】:
要获取结构,您可以在迭代器上使用取消引用运算符*
。要获得指向结构的指针,请使用地址运算符&
。
例如&*it
但是(这很重要)您应该首先检查迭代器是否实际上引用了列表中的有效元素。您在示例中显示代码的方式是,列表为空,temp.begin()
将返回 temp.end()
迭代器,不应取消引用。
但是我不明白为什么你需要一个指针,除非你需要调用的函数是由其他人编写的。如果您已经编写或可以重写该函数,则将其更改为使用对结构的引用(或对常量的引用),并且不需要使用指针。在 C++ 中,您确实应该尽可能避免使用指针。
至于将元素添加到列表中,那么您显示的内容应该可以正常工作。但是,如果您添加一个带有所需参数的构造函数,那么您就不需要临时变量,并且可以例如
temp.push_back(THistory(userId, trip));
【讨论】:
@user437777 您确实阅读了以“但是(这非常重要)...”开头的段落?以上是关于如何从 STL 列表中的迭代器访问指向结构的指针而不是其元素的主要内容,如果未能解决你的问题,请参考以下文章