【问题标题】:May I safely use the address of a C++ STL vector element? How? [duplicate]我可以安全地使用 C++ STL 向量元素的地址吗?如何? [复制]
【发布时间】:2021-04-02 13:29:54
【问题描述】:

我想向 C++ STL 向量添加一个元素,然后返回它的地址。也许这不是“安全的”或可能的?如果这是一件合理的事情,那我就没有运气了。

struct myStruct{...};

myStruct *myMethod() {
    myStruct myS(...);
    myVector.push_back(myS);
    // I cannot get the following line or any variant thereof to compile
    myStruct *foo = myVector.rebegin();  // or .rend()-1; or &myVector.rebegin();   
    return foo; }

正如我所说,我想做的事情是不合逻辑还是违法的,如果不是,我该怎么做?我不想使用 myS 的地址,因为它在堆栈上,而且我无法将其设为静态,因为我每次通过该方法都对其进行重新参数化。

谢谢, 查尔斯

【问题讨论】:

  • myVector的范围是什么?你对vector<myStruct>::iterator有什么看法?
  • @JaMiT 的链接我认为回答了我的问题。我想也许我不想/“不能”这样做,因为对向量的添加可能会移动东西,所以地址可能会变得不可预测地无效。同意?不同意?
  • @Beta myVector 处于班级级别,我没有任何反对意见。例如, rbegin() 不返回一个 vector::iterator 吗?
  • 我想我需要将向量重新做为 ,分配一个新元素,并在运行结束时将其删除。
  • 仅仅因为你可以并不意味着你应该。如果您的设计需要这样做,那么您可能应该仔细研究一下并考虑修改它。您还没有真正说明为什么需要这个,所以我想知道我们是否正在研究 XY 问题。

标签: c++ vector stl element


【解决方案1】:

你想要return &myVector.back();

【讨论】:

    【解决方案2】:

    C++11 及更高版本中的 std::vector 具有名为“data()”的成员函数,它可以做你想做的事情

    https://en.cppreference.com/w/cpp/container/vector/data

    【讨论】:

    • 如我所见,你需要的是指针,而不是迭代器,所以 data() 适合你
    • data() 成员返回 first 元素的地址。问题是寻找 last 元素的地址。
    • 好的,返回 vec.data() + sizeof(MyStruct)*(vec.size() -1); -;)
    • ...而且我没有 C++1。 :-(
    猜你喜欢
    • 2013-09-27
    • 2020-05-06
    • 2020-11-02
    • 2018-04-19
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多