如何在C++中获取向量的最后一个元素的字段?

86

我有一个结构体向量vec,其中每个结构体有元素int a, int b, int c。我想将最后一个结构体中的元素c赋值给某个int var。请提供一个简单的解决方案,我正在困扰于这个问题。

var = vec.end().c;

1
重复问题:https://dev59.com/GHA65IYBdhLWcg3wvxeE - kebs
4
只是另一种简单的方法来实现它:var=v[v.size() - 1]; 必须检查向量是否为空。 - ani627
*vec.rbegin() - Michael Pacheco
8个回答

140

如果您想要访问向量中的最后一个元素,则可以使用back()成员函数来实现。例如:

int var = vec.back().c;

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

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

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


虽然,我能看出一种可能性来满足我们两个。你可以提议使用vec.back(),但要向他解释它仅适用于非空向量,并且如果他不确定代码此时向量的状态,那么需要检查vec.empty() - Christian Rau
1
@WhozCraig 我理解这一点,但这不是一个提醒,而是对他的问题的明确回答。这是我唯一的问题。向新手教授这样的安全和清洁注意事项是很好的,但同样你必须特别小心,不要灌输他们教条主义的行为,而是要重新思考每种情况下这些检查的必要性。 - Christian Rau
1
@ChristianRau 现在我真的接受这个观点。我一直在寻找提高答案技能的方法,当你用这种方式表达时,对我来说更有意义。所以问题不在于代码,而在于假设它总是“唯一”解决方案。我同意它可能被视为这样,并且应该更好地解释。我会及时更新答案。 - WhozCraig
@ChristianRau 好的,已更新。希望更有说服力。我将开始撤回我认为对原帖问题没有贡献的评论。感谢您的耐心等待。 - WhozCraig
1
更好了。+1 不再提供水晶球答案。+1 提供了额外信息,虽然不是立即相关的问题,但提高了OP的整体意识。;) - Christian Rau
显示剩余2条评论

21

vec.end()是指向vector中末尾位置的迭代器。因此,您无法对其进行解引用并访问成员值。即使在空vector中(在这种情况下vec.end() == vec.begin()),vec.end()迭代器始终有效。

如果要访问您的vector的最后一个元素,请使用vec.back(),它返回一个引用(而不是迭代器)。请注意,如果vector为空,则会导致未定义的行为;最有可能是崩溃。


10
使用 back()
var = vec.back().c;

5
尝试这个:var = vec.back().c; 此外,您可以修改您的代码,如下:
var = vec.rbegin()->c;

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


不行;vec.end() 已经超出了末尾,所以 *vec.end() 是无效的。 - Chowlett
不,解引用结束迭代器是未定义的行为,而且与 back 不等价。 - pmr
抱歉打错了,我是指rbegin()。 - Ivaylo Strandjev
@ChristianRau 我已经编辑了我的回答,请再仔细看一下。不需要用 prev,直接使用 rbegin 即可。 - Ivaylo Strandjev

2

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

end() 返回 vector 的末尾迭代器(不是最后一个元素)。back() 返回最后一个元素的引用。它的相对应函数是front()


1

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


0

以下代码对我有效。

int var;
var =  *(std::end(bar)-1);
std::cout<<var<<std::endl;

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接