имя члена структуры - поиск - PullRequest
       10

имя члена структуры - поиск

0 голосов
/ 21 октября 2010

В предыдущем вопросе я устроил там большой беспорядок.Итак, я хочу дать ему новую попытку.

<code>
struct emp
{
    int salary;
    string empid;
};
struct payroll
{
    int empid;
    int deductions;
};
    emp a1,a2, a3;  

    a1.salary = 9000;
    a1.empid = 1;

    a2.salary = 1000;
    a2.empid = 2;

    a3.salary = 9000;
    a3.empid = 3;

    payroll p1,p1,p3;   

    p1.empid = 1;
    p1.deductions = 10;

    p12.empid = 2;
    p2.deductions = 20;

    p3.empid = 3;
    p3.deductions = 30;

сейчас, из командной строки, которую я дал вот так

empid = 1;
</code>

, тогда мне нужен ответ, что a1 и p1.Здесь мне нужно проверить, имеют ли структуры имя члена: empid - если true - тогда проверить empid = 1.
Как это сделать в общем виде.Я имею в виду, если у меня есть 30 структур, как это сделать.Дайте мне любую идею, если это невозможно, то как это сделать, используя любую другую структуру данных.

Ответы [ 3 ]

2 голосов
/ 21 октября 2010

Не существует переносимого способа динамической проверки имени переменной-члена структуры.Если вы не хотите проверять имя переменной-члена, используйте std::vector для хранения экземпляров структуры.Используйте std::find_if для поиска конкретного экземпляра, который удовлетворяет предикату.См. эту ссылку для примера использования find_if.Если вы действительно хотите проверить, существует ли поле с именем empid в struct, используйте вместо него std::map:

typedef std::map<std::string, int> emp;
typedef std::map<std::string, int> payroll;
typedef std::vector<emp> emp_list;
typedef std::vector<payroll> payroll_list;

emp_list emps;
emp a1;
a1["empid"] = 1;
a1["salary"] = 9000;
emps.push_back(a1);
// ...

payroll_list pays;
payroll p1;
p1["empid"] = 1;
p1["deductions"] = 10;
pays.push_back(p1);
// ...

// use an iterator over emps and pays to check for specific items
emp_list::const_iterator eit = emps.begin ();
emp_list::const_iterator eend = emps.end ();
while (eit != eend)
  {
    emp e = *eit;
    int eid = e["empid"];
    if (eid == empid)
      {
        std::cout << e["salary"] << '\n';
      }
    eit++;
  }
// ...
0 голосов
/ 21 октября 2010

Если я правильно понимаю ваш вопрос, если у вас есть 30 структур (таблиц) в вашей «базе данных», вы хотите найти все структуры, которые имеют «empid» в виде столбца (то есть члена структуры)? В C ++ я не знаю механизма для проверки того, имеет ли структура определенный член по имени, по крайней мере, по имени, предоставленному во время выполнения. Вы должны хранить это в некоторой форме «метаданных» - например, сопоставления со строковыми ключами, которые, например, перечисляют набор структур (или закодированы в логике со сравнением строк и т. д.) ...

Вот примерный набросок ...

Класс "таблица", введенный в тип строки (т.е. структура)

class table
{
  // some virtual methods common to all classes..
};

template <typename _Row>
class data_table : public table
{
  // methods

  // real data
  std::vector<_Row> data;
};

тогда вам нужен класс базы данных для хранения всех таблиц ..

class database
{
  // methods
  std::map<int, boost::shared_ptr<table> > tables; // here int is for a unique id for table
};

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

std::multimap<std::string, boost::shared_ptr<table> > columns;

Это вы должны заполнить, используя ваши знания структур, например, эта карта может содержать, для вашего кода выше:

columns["empid"] = id of table<emp>;
columns["empid"] = id of table<payroll>;

и т.д.

Теперь вы можете передать «запрос» в свой класс «базы данных», где вы говорите что-то вроде «empid» = 1, а затем вы просматриваете карту столбцов и находите все экземпляры таблиц, а затем каждую таблицу. Вы можете запросить с помощью «empid» = 1. Что касается отображения «empid» на действительное поле empid в структуре emp, вы должны встроить эту логику в методы в структуре emp, которая table<emp> может делегировать (или если вы можете придумать умный способ хранения ссылок на участников ...)

Это всего лишь предложение ...

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

Edit:

struct emp
{
  int empid;
  string empname;

  template <typename T>
  bool matches(const string& field_name, const T& value)
  {
    if (field_name == "empid")
      return empid == value;
    else if (field_name == "empname")
      return empname == value;
    // etc
    return false;
  }

};

Таким образом, «метаданные» кодируются в логике для теста, вы передаете имя строкового поля, а затем, в зависимости от того, что это, вы сравниваете соответствующее значение ... Это не очень эффективно, но работает ...

0 голосов
/ 21 октября 2010
  1. Вы должны использовать согласованный тип данных для empid для всех struct с.
  2. Как @Vijay Mathew предлагает , используйте vector, а затем выполните поиск. В качестве альтернативы вы можете использовать map с ключом empid, это даст лучшую производительность для большого количества записей.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...