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