【问题标题】:How can I get a field from the last element of a vector in C++?c++向量最后一个元素字段
【发布时间】:2012-12-25 20:46:32
【问题描述】:

我有一个结构向量 vec。这样的结构有元素int a, int b, int c。我想从向量中的最后一个结构中将元素 c 分配给一些 int var。请问你能给我这个简单的解决方案吗?我会这样排成一排:

var = vec.end().c;

【问题讨论】:

标签: c++ vector structure


【解决方案1】:

使用back() 成员可以立即回答有关获取对向量中最后一个元素的访问权的问题。如:

int var = vec.back().c;

注意:如果您的向量可能为空,则对 back() 的此类调用会导致未定义的行为。在这种情况下,您可以使用empty() 成员使用back() 之前检查向量的空状态:

if (!vec.empty())
   var = vec.back().c;

这两种方法中的一种可能适用于您的需求。

【讨论】:

  • 不过,我可以看到满足我们双方的可能性。您可以只提出vec.back(),但向他解释它仅适用于非空向量,如果他在代码的这一点上不确定向量的这种状态,则需要检查vec.empty() .
  • “三行代码提醒非本地标准容器的人...” - 它不会提醒他考虑不确定状态,如果他真的是一个新手。他会认为这是理所当然的,并开始在各处发送垃圾邮件std::vector::emptys。就像说的那样,答案可以用更具防御性的措辞来表达。但是好吧,这是你的决定,当然。
  • @WhozCraig 我明白这一点,但这不是提醒,而是对他问题的明确回答。这是我唯一的问题。向新手教授这些安全和清洁注意事项是很好的,但同样您必须特别小心,不要向他们灌输教条行为,而是要重新考虑在每种情况下进行此类检查的必要性。
  • @ChristianRau 现在那个我真的买了。我一直在寻求提高回答技巧,当你这样说时,这对我来说更有意义。所以代码不是问题,它的假设总是 the 解决方案。我同意它可以被视为这样,并且应该更好地解释。我会在适当的时候更新答案。
  • 好多了。 +1 不再提出水晶球答案。 +1 用于提供与问题不直接相关但提高 OP 整体意识的附加信息。 ;)
【解决方案2】:

vec.end() 是一个迭代器,它引用向量中的末尾位置。因此,您不能尊重它并访问成员值。 vec.end() 迭代器始终有效,即使在空向量中(在这种情况下 vec.end() == vec.begin()

如果您想访问向量的最后一个元素,请使用vec.back(),它返回一个引用(而不是迭代器)。但是请注意,如果向量为空,这将导致未定义的行为;很可能是崩溃。

【讨论】:

    【解决方案3】:

    使用back():

    var = vec.back().c;
    

    【讨论】:

      【解决方案4】:

      var = vec.back().c; 是你想要的。

      end() 在向量的末尾返回迭代器(不是元素)。 back() 返回对最后一个元素的引用。它也有对应的 front()

      【讨论】:

        【解决方案5】:

        试试这个:var = vec.back().c;

        你也可以修改你的代码:

        var = vec.rbegin()->c;
        

        在这两个版本中,首先确保向量不为空!

        【讨论】:

        • 不; vec.end() 已经结束,所以*vec.end() 无效。
        • 不,取消引用结束迭代器是未定义的行为,不等同于back
        • 抱歉错字。我的意思是 rbegin()
        • @ChristianRau 我已经编辑了我的答案,请再看一下。不需要prev 只需使用 rbegin。
        【解决方案6】:

        您可以简单地使用back,因为它返回对最后一个元素的引用。
        var = vec.back().c

        【讨论】:

          【解决方案7】:

          您可以使用std:vector<T>:back() 函数,例如vec.back().c。 见http://www.cplusplus.com/reference/vector/vector/back/

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-05-22
            • 1970-01-01
            • 2015-07-16
            • 2012-08-20
            • 2015-01-11
            • 1970-01-01
            • 1970-01-01
            • 2018-08-01
            相关资源
            最近更新 更多