передать в функцию только член std :: vector из struct (C ++) - PullRequest
0 голосов
/ 16 января 2012

У меня есть структура:

struct myStruct {

    // there are other members as well
    float U, V, W;
}
std::vector <myStruct> myVec;
myVec.resize(num);

Я хочу передать только myVec []. U для всех myVec в функцию.

Ответы [ 4 ]

5 голосов
/ 16 января 2012

Передайте пару итераторов в функцию:

struct pick_U : std::unary_function<myStruct&, float&> {
    float &operator()(myStruct &ms) const { return ms.U; }
};

your_function(
    boost::make_transform_iterator(myVec.begin(), pick_U()),
    boost::make_transform_iterator(myVec.end(), pick_U()),
    ... other args ...
};

Затем your_function может выполнить итерацию по числам с плавающей запятой.

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

Поскольку для массива с плавающей запятой требуется непрерывное хранение, а ваш вектор myVec не хранит непрерывно U s, вам необходимо сделать копию:

std::vector<float> uv;
uv.reserve(myVec.size());

for (auto const & s : myVec) { uv.push_back(s.U); }

// now use uv.data() if your callee needs a float*

На старых компиляторах вы должны сказать:

for (std::vector<myStruct>::const_iterator it = myVec.begin(), end = myVec.end(); it != end; ++it)
    uv.push_back(it->U);

Вы также можете сказать &uv[0] вместо uv.data(), чтобы получить необработанный указатель на массив.

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

Два варианта:


Первый вариант: изменить дизайн так, чтобы вместо

struct myStruct 
{

    // there are other members as well
    float U, V, W;
}

std::vector <myStruct> myVec;

У вас есть

struct myStructs {

    // there are other members as well
    std::vector<float> Us, Vs, Ws;
}

myStructs allOfMyStructs;

Тогда вы можете просто передать вектор Us. (Это также называется программированием, ориентированным на данные)


Второй вариант: скопировать все элементы U в один вектор.

std::vector<float> Us;
for (auto iter = myVec.begin(); iter != myVec.end(); iter++)
   Us.push_back(iter->U);

Тогда вы просто передаете вектор Us.

0 голосов
/ 17 января 2012

Судя по вашему примеру кода и вашему объяснению, вы хотите что-то вроде этого:

#include <iostream>
#include <vector>
using namespace std;

struct myStruct {
    float u;
};

void foo(float& f) {
    f = 44.1;
}

int main() {
    vector<myStruct> myVec(5, myStruct());
    for (auto& i : myVec) {
        foo(i.u);
    }
    for (const auto& i : myVec) {
        cout << i.u << endl;
    }
}

// g++ -Wall -Wextra test.cc -o test -O3 -s -std=c++0x

например.

Как и все, что вы хотели знать, это как передать myVec [n] .U в функцию.

Но, глядя на ваши комментарии и другие посты, я не уверен.

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