Как извлечь значение из объекта структуры по ранее сохраненному идентификатору?C ++ - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть сценарий C ++ со структурным объектом 'Particle', с сохранением позиции x, y, z.Я создаю несколько объектов частиц с уникальными идентификаторами.Как получить положение частицы по идентификатору?Что-то вроде: component.getPosByID (int ID);

Мой код выглядит следующим образом:

struct Particle {
Vector position     { 0.0f, 0.0f, 0.0f };
Vector velocity     { 0.0f, 0.0f, 0.0f };
Vector acceleration { 0.0f, 0.0f, 0.0f};
Vector color        { 1.0f, 0.0f, 0.0f }; // RED
int ID = 0;}

Я пробовал в структуре:

    float getPosX(int ID)
{
    return this->position.x;
}

с: float ix = particles->getPosX(5);

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

Спасибо!

РЕДАКТИРОВАНИЕ

Вектор - это структура:

struct Vector
{
float x, y, z;}

Частицыхранится в массиве:

const int MaxParticles = 5;
Particle particles[MaxParticles];

Ответы [ 4 ]

0 голосов
/ 17 декабря 2018

Вот определение класса, которое может помочь вам достичь этого.Здесь вы можете использовать std :: map вместо массива частиц для лучшей производительности поиска.

struct Particle 
{
    /// This is your existing particle struct
}

class Particles
{
    const int MaxParticles = 5;
    Particle particles[MaxParticles];
    Particles()
    {

    }

    void AddParticle(Particle p)
    {
        ///Insert particle 'p' into array 'particles'
    }

    void RemoveParticle(Particle p)
    {
        ///Remove particle 'p' from array 'particles'
    }

    Particle GetParticle(int ID)
    {
        Particle p;
        ///Add loop over 'particles' to search particle with specified ID and then return that particle
        return p;
    }

    Vector GetParticlePosition(int ID)
    {
        Vector v;
        ///Add loop over 'particles' to search particle with specified ID and then return it postion
        return v;
    }
}
0 голосов
/ 17 декабря 2018

Поскольку вы храните частицы в массиве, вы должны пройти их одну за другой, чтобы проверить

float getPosX(int ID)
{
    for (auto const & p : particles) { // assume particles are a global variable
        if (p.ID == ID) 
            return p.position.x;
    }
    return 0; // or some value to indicate error or not found
}
0 голосов
/ 17 декабря 2018

если вы используете массив для хранения ваших частиц, а индексы массива не соответствуют идентификаторам частиц, то вам нужно просто выполнить поиск в массиве.

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

struct Vector { 
    float x, y, z;
};

struct Particle {
    int ID;
    Vector position     { 0.0f, 0.0f, 0.0f };
    Vector velocity     { 0.0f, 0.0f, 0.0f };
    Vector acceleration { 0.0f, 0.0f, 0.0f};
    Vector color        { 1.0f, 0.0f, 0.0f }; // RED
};

int main() {
    const int MaxParticles = 5;
    Particle particles[MaxParticles] = {{0},{3},{2},{4},{5}};

    // find particle with loop
    int findid = 3;
    for(size_t i=0;i< MaxParticles;++i)
    {
        if (particles[i].ID == findid)
        {
            std::cout << "found partcile with id " << findid <<  " at index " << i << std::endl;
            break;
        }
    }

    // find particle with std::find_if
    auto iter = std::find_if(particles,particles+MaxParticles, [&](const Particle& p){
        if (p.ID == findid)
            return true;
        return false;
    });

    std::cout << "Found particle " << iter->ID << std::endl;

    return 0;
}

Демонстрация

Возможно, было бы лучше использовать ассоциативный контейнер, такой как std :: map, как предложено в одном из других ответов.

0 голосов
/ 17 декабря 2018

Частицы хранятся с использованием массива

Если идентификаторы частиц соответствуют индексам массива, тогда обращайтесь к этому массиву по id:

float ix = particles[id].position.x;

Если нет, выВозможно, будет лучше хранить их внутри некоторой ассоциативной структуры, такой как map:

std::map<int, Particle> particles;

. Тогда вы можете удалить идентификатор из структуры и использовать тот же код, что и выше.

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