【问题标题】:Get index of object inserted into a vector获取插入向量中的对象的索引
【发布时间】:2012-12-02 12:02:56
【问题描述】:

如何获取对象实际插入的位置?

#include <vector>
using namespace std;

vector<SomeClass> list;
SomeClass object;
list.push_back(object);

list[...].method(); // I do not have the key

不幸的是,push_back 没有返回任何内容,因为它的返回类型是 void

【问题讨论】:

  • 作为一个不相关的提示,永远不要使用“list”作为变量的名称,尤其是“vector”类型的变量。 'list' 也是标准库中的一个容器。对于必须阅读此代码的任何人来说,拥有一个名为 list 的向量将是一个持续的痛苦来源。
  • 我把你的类名从class(这是无效的C++)改成了SomeClass,并在看似“琐碎的行为”后面加上了a thought about the idea

标签: c++ stl vector std


【解决方案1】:

如果v 是您的向量,则以下将为您提供位置(即索引):

v.push_back(object);
size_t pos = v.size() - 1;

或者您可以在致电push_back() 之前查看size()。那么你就不需要减去一个。

【讨论】:

  • 感谢您的回答以及插入前查看尺寸的提示。
【解决方案2】:

您可以使用back() 成员来获取对最后一个元素的引用:

list.push_back(object);
list.back();

或者,由于 push_back() 只是将对象添加到末尾,因此新插入元素的索引是向量大小减一:

list.push_back(object);
vector<my_class>::size_type object_pos = list.size() - 1;

【讨论】:

  • 我假设它给出了一个指向最后插入元素的迭代器?那一刻,我对索引作为一个整数而不是对象本身更感兴趣。
  • @sharethis 不,back() 返回一个引用。要获取插入元素的索引,请计算新的向量大小并减一。
  • 同样,&amp;v.back()-&amp;v.front() 之后。
【解决方案3】:

如果您需要在拥有特定元素后定位它们,并且您不想提前保存索引(以防您对向量执行排序/添加/删除/等操作),您可以也可以使用find algorithm

【讨论】:

  • 好吧,您知道插入了多少元素,因此您可以比使用find 更容易(也更高效)找到索引。
  • 我是说如果你需要在插入元素后找到一些键,并且你还没有保存你想要的索引,这可能会起作用。只是根据问题考虑的另一种工具。
【解决方案4】:

虽然NPE's correct answer 展示了一个务实的 POV,但我专注于这个简单答案的推理。可观察到的行为是just the purpose of the push_back member function

将给定的元素值附加到容器的末尾。

所以索引在插入之前总是等于v.size(),或者,等效地,插入之后等于v.size()-1。如果无法满足此断言,则容器的容量无法增加,或者您的类在复制/移动构造函数中引发异常(请参阅文档中的 Exceptions 部分)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    • 2020-03-26
    • 2014-02-21
    • 1970-01-01
    相关资源
    最近更新 更多