如何从 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&lt;THistory&gt;::iterator it = temp.begin(); - 嗯...查看您的代码,nothing 那时在列表中,对吗?该迭代器不会神奇地开始指向您在获取它之后插入的内容。 是的,我错过了... thnx.. 【参考方案1】:

要获取结构,您可以在迭代器上使用取消引用运算符*。要获得指向结构的指针,请使用地址运算符&amp;

例如&amp;*it

但是(这很重要)您应该首先检查迭代器是否实际上引用了列表中的有效元素。您在示例中显示代码的方式是,列表为空,temp.begin() 将返回 temp.end() 迭代器,不应取消引用。

但是我不明白为什么你需要一个指针,除非你需要调用的函数是由其他人编写的。如果您已经编写或可以重写该函数,则将其更改为使用对结构的引用(或对常量的引用),并且不需要使用指针。在 C++ 中,您确实应该尽可能避免使用指针。


至于将元素添加到列表中,那么您显示的内容应该可以正常工作。但是,如果您添加一个带有所需参数的构造函数,那么您就不需要临时变量,并且可以例如

temp.push_back(THistory(userId, trip));

【讨论】:

@user437777 您确实阅读了以“但是(这非常重要)...”开头的段落?

以上是关于如何从 STL 列表中的迭代器访问指向结构的指针而不是其元素的主要内容,如果未能解决你的问题,请参考以下文章

C++ 的STL中,迭代器那个指针为何++能指向下一个元素?

迭代器在添加到添加到列表向量的结构中时会停止指向某个值吗?

stl中vector中erase后迭代器为啥会失效

STL面试题

模拟实现stl中的list

STL概念