【问题标题】:How do we understand the Iterator for a set<pair<int,int>>?我们如何理解 set<pair<int,int>> 的迭代器?
【发布时间】:2021-02-20 15:43:32
【问题描述】:

所以我声明了一个包含一对整数的集合。 temp 是什么?这是否意味着temp 将指向pair&lt;int,int&gt;

set<pair<int, int>> myset;
pair<int, int> temp = *(myset.begin());

下面的代码与上面的代码有何不同?我能否定义一下这些代码到底在做什么。

pair<int, int>::iterator temp;
temp = *(myset.begin());

【问题讨论】:

  • 这两个代码sn-ps都编译了吗?
  • 不同的是第二个代码sn -p 不会编译。
  • A std::set&lt;std::pair&lt;int, int&gt;&gt;::iterator 如果是有效的迭代器,则取消引用对 std::pair&lt;int, int&gt; 的引用,如果不是有效的迭代器(例如 myset.end()),则具有未定义的行为。
  • 我没有测试第二个代码是否符合。我想知道第二个代码与第一个代码有何不同。
  • 测试第二个代码是否编译,你会知道它们有何不同。

标签: c++ c++11 iterator


【解决方案1】:

在这段代码中:

set<pair<int, int>> myset;
pair<int, int> temp = *(myset.begin());

变量temp 是一个pair,包含两个int

myset.begin() 返回一个迭代器,指向名为pairset 中名为myset 的第一个元素。它被* 取消引用,并且值(pair)被复制到temp

在这段代码中:

pair<int, int>::iterator temp;
temp = *(myset.begin());

变量temp 首先被声明为pair&lt;int, int&gt; 的迭代器,然后代码尝试将pair&lt;int, int&gt; 的值复制到其中。这不会编译。

【讨论】:

  • "变量 temp 首次被初始化"它没有被初始化。它被声明了。
【解决方案2】:

在第二个示例中,您尝试将 std::pair&lt;int, int&gt; 分配给迭代器。这不起作用,因为迭代器只指向数据,并不拥有数据。

pair<int, int>::
iterator temp = *(myset.begin());
//                     ^ gives iterator at the start of set, pointing to first el.
//              ^ dereferences iterator, gives `std::pair<int, int>&`
//            ^ `std::pair<int, int> is assigned to non-reference, and therefore 
//               forced to copy.
//  ^ temp is an iterator to an element (iterators don't own elements, 
//               only point to them). You can't initialize an iterator with data.

【讨论】:

    猜你喜欢
    • 2018-04-01
    • 1970-01-01
    • 2020-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多