все!
Я пытался найти в уже существующей теме об этом, но не смог найти. Если вы знаете, кто отвечает на мой вопрос, пожалуйста, поделитесь им.
Ну, вот моя проблема.
Я пишу программу, в которой каждый объект хранит всю информацию относительно себя в переменных внутри своего класса (например, std :: vector).
К сожалению, поскольку я использую библиотеку, разработанную другими людьми, некоторые операции могут быть выполнены только с одним std :: vectors. Таким образом, я нашел способ «решить» проблему — сложить все отдельные векторы внутри каждого объекта в большой std :: vector, затем обработать этот «стек» и, наконец, «разделить» обновленную информацию обратно внутри каждого объекта.
Мой первый подход к суммированию информации состоял в том, чтобы выделить новый пустой std :: vector и затем, пройдя через весь объект, push_back всю информацию в каждом отдельном векторе. Вместо этого для создания стека я создал новый пустой субвектор, прошел через стек, отодвинул нужную мне информацию и затем назначил субвектор связанному телу.
Чтобы попытаться ускорить процесс, я подумал, что мог бы использовать функции 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 &vector)
{
m_vector = vector;
}
~MyObject();
std::vector get_vector()
{
return m_vector;
}
void set_vector(std::vector &vector)
{
m_vector = vector;
}
void set_vector_begin(unsigned int &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*> &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 &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 &input, std::vector &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;
};
надеюсь, это поможет
Задача ещё не решена.
Других решений пока нет …