доступ к n-му элементу (значению) вектора после сортировки - PullRequest
1 голос
/ 16 мая 2010

Этот вопрос является расширением Этот вопрос Я задал.

У меня есть 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 голосов
/ 16 мая 2010

Возможно, вы хотите return & vec_B.back (); '?

0 голосов
/ 16 мая 2010

Это работает для меня:

#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() после изменения вектора, будьте очень осторожны, чтобы не выполнить операцию (например, вставку), которая заставила бы вектор перераспределиться. Если это произойдет, ваш указатель на вектор будет висящим указателем, и кто знает, что вы получите, когда вы разыменуете его!

0 голосов
/ 16 мая 2010

просто используйте vec_B.back(), а не &vec_B.back(), чтобы получить ссылку на последний элемент вектора (вам не нужен указатель, не так ли?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...