#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. Я мог бы исправить все неправильные имена переменных, намеренно неправильный синтаксис, отсутствующие функции доступа, но я не собираюсь этого делать, потому что это ваша ответственность. Откуда мне вообще знать, какие ошибки в этом сообщении, а какие в вашем реальном коде? 🙂