【问题标题】:accessing nth element (value) of a vector after sorting排序后访问向量的第 n 个元素(值)
【发布时间】:2010-08-28 04:28:58
【问题描述】:

这个问题是我问的this question 的延伸。

我有一个 std::vector vec_B.它存储类 Foo 的实例。此向量中元素的顺序在代码中会发生变化。

现在,我想访问向量的当前“最后一个元素”或当前“第 n 个”元素的值。如果我使用下面的代码使用getLastFoo() 方法获取最后一个元素,它不会返回正确的值。

例如,以向量的最后一个元素开头有Foo.getNumber() = 9。按num的降序排序后,对于最后一个元素Foo.getNumber() = 0

但是使用下面的代码,它仍然返回 9.. 这意味着它仍然指向作为最后一个元素的原始元素。

我应该对下面的代码进行哪些更改以使“lastFoo”指向正确的最后一个元素?

class Foo {      
      public:
             Foo(int i);
             ~Foo(){};
             int getNum();
      private:
           int num;    
};
Foo:Foo(int i){
   num = i;
}
int Foo::getNum(){
  return num;
}
class B {
      public:             
             Foo* getLastFoo();
             B();
             ~B(){};             
      private:
             vector<Foo> vec_B;
};

B::B(){

    int i;
    for (i = 0; i< 10; i++){
        vec_B.push_back(Foo(i));
    }
    // Do some random changes to the vector vec_B so that elements are reordered. For 
    // example rearrange elements in decreasing order of 'num'
    //...
    }

Foo* B::getLastFoo(){
    return &vec_B.back();
};
int main(){
    B b;
    Foo* lastFoo;   
    lastFoo = b.getLastFoo()
    cout<<lastFoo->getNumber();
    return 0;
}

【问题讨论】:

  • 我怀疑您省略的“做一些随机更改”部分可能存在问题。也许你可以把它贴出来?
  • 抱歉我的错误,我在原始代码中打印值的方式有一个错误。所以这不是问题。将删除问题。非常感谢您的回答!!!

标签: c++ stl


【解决方案1】:

只需使用vec_B.back() 而不是&amp;vec_B.back() 来获取对向量中最后一个元素的引用(您不需要指针吗?)

【讨论】:

  • 实际上我需要一个指向 Foo 实例的指针。 Foo* lastFoo 是指向该元素的指针。所以,我可以使用 lasFoo->getNumber()。所以只返回vec_B.back() 就会出错
  • @memC - 如果你有参考,你会使用lastFoo.getNumber()
【解决方案2】:

也许你想要'return &vec_B.back();'?

【讨论】:

  • 哎呀这是一个错字,代码实际上是return &amp;vec_B.back() 所以没问题
【解决方案3】:

这对我有用:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

class Foo 
{
public:
    Foo(int n) 
        : num(n) 
    {}

    int num;
};

bool cmp(const Foo& a, const Foo& b)
{
    // sort in descending order
    return b.num < a.num;
}

int main()
{
    vector<Foo> v;
    for (int i=0; i<10; ++i) {
        v.push_back(Foo(i));
    }
    sort(v.begin(), v.end(), &cmp);

    Foo* vf = &v.back();
    cout << vf->num << endl;
    return 0;
}

应该等同于您的示例,并在运行时在我的机器上打印0。修复并检查您的代码示例并将其与您的实际代码进行比较,您可能会发现问题。

注意:您提到您在对向量进行操作之前和之后检查最后一个元素。如果您持有指向向量的指针并且在对向量进行变异后没有再次调用v.back(),请非常小心,不要执行会导致向量重新分配的操作(例如插入)。如果发生这种情况,你指向向量的指针将是一个悬空指针,谁知道你取消引用它会得到什么!

【讨论】:

    猜你喜欢
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    • 2020-09-06
    • 1970-01-01
    • 1970-01-01
    • 2019-06-29
    • 2023-04-07
    • 1970-01-01
    相关资源
    最近更新 更多