Получение векторов членов из векторов объектов - PullRequest
0 голосов
/ 13 января 2012

У меня есть следующие настройки

class obj {
  public:
  int a();
  int b();
  int c();
  int d();
};

std::vector<obj> obj_vector;
//Fill obj_vector

и я хотел бы получить доступ к методам (это для интерфейса, который ожидает векторы целых по отдельности).

void func(vector<int>a ,vector<int> b,vector<int> c,vector<int> d);

Сначала я думал, что расширение вектора - лучший подход, но меня об этом предупреждали.

Я реализовал

get_a_vec(vector<obj>);

и т. Д., Но это немного неуклюже. Есть ли хорошие альтернативы?

Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 13 января 2012

Напишите функцию, которая извлекает нужный элемент из одного объекта.

Затем передайте эту функцию std::transform.

Если у вас есть, например, функция int get_a_member(obj&), просто вызовите

std::vector<int> avec;
std::transform(obj_vector.begin(), obj_vector.end(), get_a_member);

Если вам нужна более сложная или многократно используемая функция, вместо этого сделайте ее функтором. Затем вы можете передать ему параметры в его конструкторе (например, сообщив ему, какой элемент возвращать).

1 голос
/ 13 января 2012

Вы можете написать универсальную функцию для извлечения любого члена класса из последовательности объектов:

template <typename InIt, typename OutIt, typename Class, typename Member>
void extract(InIt start, InIt end, OutIt out, Member Class::*member) {
    for (; start != end; ++start, ++out) {
        *out = (*start).*member;
    }
}

// Example
int main()
{
    std::vector<obj> objs {{1,2,3,4},{5,6,7,8}};
    std::vector<int> ints;

    extract(objs.begin(), objs.end(), back_inserter(ints), &obj::a);

    std::copy(ints.begin(), ints.end(), 
              std::ostream_iterator<int>(std::cout, "\n"));
}
0 голосов
/ 13 января 2012

Я понял, что вам нужна функция, которая извлекает значения a из ваших obj s в заданном vector и помещает их в другой vector, если это правда, тогда я предлагаю использовать friend функция.

Объявление функции друга в классе obj позволяет этой функции обращаться к private членам данных этого класса.

class obj {
    friend vector<int> get_a_vec(const vector<obj>&);
    friend vector<int> get_b_vec(const vector<obj>&);
    friend vector<int> get_c_vec(const vector<obj>&);
    friend vector<int> get_d_vec(const vector<obj>&);     
    int a;
    int b;
    int c;
    int d;
};

vector<int> get_a_vec(const vector<obj>& vec)
{
    vector<int> result(vec.size());
    for (unsigned i = 0;i<vec.size();i++)
        result->at(i) = vec[i].a;
    return result;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...