использование вектора c в качестве общей переменной

#c #data-manipulation

#c #манипулирование данными

Вопрос:

все!

Я попытался выполнить поиск в уже существующей теме по этому поводу, но не смог ее найти. Если вы знаете ответ на мой вопрос, пожалуйста, поделитесь им.

Ну, вот моя проблема. Я пишу программу, в которой каждый объект хранит всю информацию относительно самого себя в переменных внутри своего класса (например, std::vector). К сожалению, поскольку я использую библиотеку, разработанную другими людьми, некоторые операции могут выполняться только с одним std::vectors . Таким образом, способ, который я нашел для «решения» проблемы, заключается в том, чтобы сложить все отдельные векторы внутри каждого объекта в большой std::vector, затем обработать этот «стек» и, наконец, «разделить» обновленную информацию обратно внутри каждого объекта.

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

Чтобы попытаться ускорить процесс, я подумал, что мог бы использовать функции std::vector.insert и std::copy . К сожалению, это, похоже, еще больше замедлило работу всей программы.

Итак, знаете ли вы какой-либо способ, который мог бы помочь мне ускорить выполнение моего кода?

Пример:

 class MyObject
{
   protected:
   std::vector m_vector;
   unsigned int m_vector_begin;
   unsigned int m_vector_end;

   public:
   MyObject(std::vector amp;vector)
   {
      m_vector = vector;
   }

   ~MyObject();

   std::vector get_vector()
   {
       return m_vector;
   }

   void set_vector(std::vector amp;vector)
   {
       m_vector = vector;
   }

   void set_vector_begin(unsigned int amp;index)
   {
      m_vector_begin = index;
   }

   unsigned int get_vector_begin()
   {
      return m_vector_begin;
   }

   // same for m_vector_end
};


class MyManipulator
{
   protected:
   std::vector<MyObject*> m_obj_list;

   public:
   MyManipulator(std::vector<MyObject*> amp;obj_list)
   {
      m_obj_list = obj_list;
   }

   ~MyManipulator();

   std::vector build_stack()
   {
      std::vector stack, array;

      for(unsigned int index_obj = 0; index_obj < m_obj_list.size();   index_obj)
      {
          array = m_obj_list[index_obj]->get_vector();

          m_obj_list[index_obj]->set_vector_begin(stack.size());
          stack.insert(stack.end(), array.begin(), array.end());
          m_obj_list[index_obj]->set_vector_end(stack.size());
      }
      return stack;
   }

   void unstack_vector(std::vector amp;stack)
   {
      std::vector array;

      for(unsigned int index = 0; index < m_obj_list.size();   index)
      {
         array = std::vector(stack.begin() m_obj_list[obj_index]->get_vector_begin(),
                             stack.begin() m_obj_list[obj_index]->get_vector_end());

         m_obj_list[obj_index]->set_vector(array);
      }
   }

   void do_some_stuff(std::vector amp;input, std::vector amp;output)
   {
      unstack_vector(input);

      // Does operations with the information saved in
      // the objects and builds output
   }
};


int main
{
   std::vector<MyObject*> obj_list;

   std::vector vect_ini;
   // initialise vect_ini

   MyObject* Obj1 = new MyObject*(vect_ini);
   obj_list.push_back(Obj1);

   // change values to vect_ini

   MyObject* Obj2 = new MyObject(vect_ini);
   obj_list.push_back(Obj2);

   MyManipulator* Manip = new MyManipulator(obj_list);

   std::vector stack_in  = Manip->build_stack();
   std::vector stack_out = std::vector(stack_ini.size());

   for(unsigned int index_loop = 0; index_loop < N;   index_loop)
   {
      Manip->do_some_stuff(stack_in, stack_out);

      stack_in = stack_out;
   }

   return 0;
};
  

Я надеюсь, что это поможет

Комментарии:

1. Очень сложно дать какой-либо совет, не видя фактического кода.

2. Есть ли у вас какие-либо данные профилирования, которые показывают, какие части замедлились больше всего?

3. Можете ли вы продемонстрировать с помощью некоторого кода? Как и картинка, код стоит тысячи слов.

4. @NathanOliver если это не 1000 слов кода, тогда его значение может начать снижаться!

5. Вы не понимаете. MCVE. Я мог бы исправить все неправильные имена переменных, намеренно неправильный синтаксис, отсутствующие функции доступа, но я не собираюсь этого делать, потому что это ваша ответственность. Откуда мне вообще знать, какие ошибки в этом сообщении, а какие в вашем реальном коде? 🙂