排序后访问向量的第n个元素(值)

时间:2010-05-16 06:43:08

标签: c++ stl

这个问题是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;
}

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

这对我有用:

#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(),那么要非常小心,你没有进行会导致矢量重新分配的操作(例如插入)。如果发生这种情况,你指向矢量的指针将是一个悬空指针,谁知道你取消引用它时会得到什么!