【问题标题】:Accessing structure elements using iterator使用迭代器访问结构元素
【发布时间】:2016-07-17 17:29:13
【问题描述】:

我已经定义了这个结构和向量:

struct All
{
    string name;
    int id;
};
vector<All*> all;

我正在使用 lower_bound 函数将创建的带有数据的结构插入到向量中以保持排序。

All * tmp = new All(name, id);
auto it = lower_bound(all.begin(), all.end(), name, compare2());
all.insert(it, tmp);

当我想用name = test 找到结构时,我会这样做:

auto it1 = lower_bound(all.begin(), all.end(), name, compare2());

它给了我迭代器it 到那个名称中包含测试的结构,但是为什么我不能像cout &lt;&lt; it1 -&gt; id; 这样访问结构的元素?如何访问该结构的元素?

【问题讨论】:

  • 必须在向量中存储指向 All 的指针吗?它让你和其他人的生活变得艰难。存储All 对象。
  • 无法访问是什么意思?您是否收到编译错误或运行时错误?此外,您在第二段代码中发现name 的下限而不是tmp 有点奇怪。理论上它可以工作,但我不确定它是否明显。
  • 我遇到了错误,但*it -&gt; id 解决了它我没有意识到我在那个向量中存储了指针,所以它是指向指针的指针

标签: c++ pointers vector iterator operators


【解决方案1】:

你可以这样做

cout << ( *it ) -> id;

表达式*it 给出向量中的元素是一个指针。

【讨论】:

  • 您能否给我一些解释,为什么它在访问该元素之前被取消引用?
【解决方案2】:

您必须再次取消引用您的迭代器,才能访问数据结构的字段:

(*it1)->id;

说明:

从概念上讲,迭代器只不过是指向容器中元素的指针(事实上,std::vector&lt;T&gt;::iterator 的大多数实现都是指向 T 的指针)。在您的情况下,容器元素本身就是一个指针,因此您必须取消引用迭代器两次:第一次 (*it) 为您提供对存储在容器中的指针的引用,然后由 -&gt; 运算符取消引用授予对实际对象字段的访问权限。

您编写它的方式是尝试访问迭代器的成员(如果它被实现为原始指针,则没有任何成员)

【讨论】:

    猜你喜欢
    • 2013-11-23
    • 2015-09-27
    • 1970-01-01
    • 2011-06-04
    • 2018-08-16
    • 2019-08-10
    • 2020-11-05
    • 1970-01-01
    • 2020-07-26
    相关资源
    最近更新 更多