Используйте индекс в именовании переменных во время цикла C ++ - PullRequest
0 голосов
/ 20 февраля 2012

Мне нужна подсказка при создании утилиты C ++.Я реализую алгоритм оптимизации, и на определенном этапе мне нужно было бы создать столько же новых переменных, сколько итераций цикла.Есть некоторый код, который объяснил бы это лучше:

for(int i=1;i<112;i++){
   struct nodo n_2i[111-i];           
}

Структура nodo определяется как:

struct nodo{
  int last_prod;
  int last_slot;
  float Z_L;
  float Z_U;
  float g;
  bool fathomed;
};

Я хотел бы, чтобы имена новых переменных (массивы структур) былиn_21, n_22, n_23, ... и т.д..Как я могу справиться с этим?

Ответы [ 6 ]

3 голосов
/ 20 февраля 2012

Зачем вам нужно имя, чтобы быть n_21.Вы можете использовать вектор вектора.

#include <vector>
using namespace std;
int main() {
    vector<vector<struct nodo> > n;
    for(int i=1;i<112;i++){
        n.push_back(vector<struct nodo>(111-i));       
    }
    // you can use n[0] ... n[111] now
}
1 голос
/ 20 февраля 2012

Как только код скомпилирован, имена переменных больше не присутствуют.Во время компиляции цикл представляет собой одну конструкцию (если / пока он не развернут), и в этот момент нет смысла иметь разные имена, ссылающиеся на один и тот же элемент времени компиляции ( переменная ).Весь вопрос не имеет смысла, я бы посоветовал вам предоставить одну переменную с хорошим именем, которую не нужно менять для каждой итерации.

Кроме того, c ++ не имеет массивов переменного размера, то есть конструкции C99, которую допускают только некоторые компиляторы, поэтому вы можете избавиться от этого и использовать один массив наибольших размеров, который вам понадобится вместе сконстанта, инициализированная в каждой итерации, которая будет контролировать, сколько позиций массива допустимо.Если у вас нет верхней границы размера, вы можете динамически распределять память перед входом в цикл и освобождать после завершения последней итерации.(чтобы избежать затрат на перераспределение с каждой итерацией.

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

1 голос
/ 20 февраля 2012

Вы не можете объявлять новые имена переменных во время выполнения.Лучше всего создавать std::vector переменных.

0 голосов
/ 20 февраля 2012

Я верю, что std :: map поможет здесь:

std::map< int , std::vector< struct nodo > > n;
for(int i=1;i<112;i++){
  n.insert(std::make_pair(i, std::vector<struct nodo>(111-i)));       
}

вы можете получить доступ к вашим значениям после использования индекса:

n[0].SomeProperty;
0 голосов
/ 20 февраля 2012

Карта должна сделать это для вас:

std::map<string, struct nodo*> n_2i;
0 голосов
/ 20 февраля 2012

Возможно, вы захотите использовать std::map<string,struct nodo*> и держать в нем свои элементы.

также обратите внимание, что вы не можете объявить статическую переменную, длина которой зависит от i, как показывает ваш пример, вы собираетесьдля std::vector или для динамического выделения памяти.

Если вы решите использовать vector, ваша карта будет иметь тип map<string,vector<struct node> >

...