2016-10-07 4 views
1

Я довольно новый для C++ и хочу просто проверить, насколько быстро C++ может сделать следующую работу:Улучшения моего кода

Просто создать вектор с 100 Objectc объекта-точка (х, у-координата) и переместите его на другой вектор. Повторите это k-раз. (в этом коде это 1000000 раз - int Iterator).

Ну, так как им очень новый для C++, вы видите лучший способ сделать это, или я что-то пропустил?

Im работает на Windows.

#include "Main.h" 
#include "Point.h" 
#include <iostream> 
#include <vector> 
#include <chrono> 


int main() { 
    auto start = std::chrono::high_resolution_clock::now(); 
    int Constant = 10; 
    int Iterator = 1000000; 

    std::vector<Point>* tour = new std::vector<Point>(); 
    std::vector<Point>* actions = new std::vector<Point>(); 

    for (int k=0; k<Iterator; k++) { 

     for (int i=0; i<Constant; i++) { 
      for (int j=0; j<Constant; j++) { 
       Point *p = new Point((i * 10) + j,i + 1, j + 1); 
       actions->push_back(*p); 
      } 
     } 

     while(!actions->empty()) { 
      tour->push_back(actions->at(0)); 
      actions->erase(actions->begin()); 
     } 

     actions->clear(); 
     tour->clear(); 
    } 

    auto finish = std::chrono::high_resolution_clock::now(); 
    std::cout << std::chrono::duration_cast<std::chrono::nanoseconds>(finish-start).count() << std::endl; 
} 
+0

ли программа работает? Делает ли это то, что вы хотите? Тогда вам нужно всего лишь [обзор кода] (http://codereview.stackexchange.com/tour). –

+2

Если вы хотите улучшить рабочий код, лучше поставите этот вопрос в [SE Code Review] (http://codereview.stackexchange.com/). –

+0

Дополнительная информация о работе: создать вектор из 100 объектов с x, y-координатами + id и перенести их на другой вектор, добавив объекты в инкрементный индексный порядок и удалив объекты в векторе начала – kxell2001

ответ

3

Рассмотрим распределение векторных экземпляров на стека, а не в куче, например:

std::vector<Point>* tour = new std::vector<Point>(); 
std::vector<Point>* actions = new std::vector<Point>(); 

просто становится:

// std::vector default constructor creates empty vectors. 
std::vector<Point> tour; 
std::vector<Point> actions; 

Аналогично, сделайте не без необходимости ineff iciently выделить Point с на кучу!

Point *p = new Point((i * 10) + j,i + 1, j + 1); 
actions->push_back(*p); 

Просто сделать что-то гораздо более простой и эффективный, как:

actions.push_back(Point{x, y, z}); 

Кроме того, вы можете скопировать из одного вектора на другой только с помощью перегружен operator=:

destVector = sourceVector; 

Согласно вашему дополнительному комментарию, если вы хотите переместить содержимое из одного вектора к другому, вы можете использовать std::move(), например:

// Data moved from sourceVector to destVector. 
// Leaves sourceVector empty. 
destVector = std::move(sourceVector); 

Кроме того, если у вас есть константы времени компиляции, вы можете использовать constexpr:

constexpr int Constant = 10; 
constexpr int Iterator = 1000000; 
+0

Thnx для быстрого ответа. Это очень помогло мне. Да, я забыл упомянуть, что я просто не хочу копию вектора. Более того, я хочу поэтапно перемещать объекты на другой вектор. Это имеет какое-то отношение к другой проблеме, с которой я сталкиваюсь. – kxell2001

+0

@ kxell2001: Добро пожаловать. Рад помочь. –

+0

@ kxell2001 - Если вы хотите переместить все элементы из одного вектора в другой, вы можете выполнить 'destVector = std :: move (sourceVector);'. Это не требует копирования. –

1

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

Так что вместо этого просто скопируйте вектор.

while(!actions->empty()) { 
    tour->push_back(actions->at(0)); 
    actions->erase(actions->begin()); 
} 

становится

tour = actions; 
+0

Если вы действительно хотите переместить элементы по отдельности из одного вектора в другой, сделайте это в цикле без стирания. Если вы настаиваете на стираниях, сначала отмените вектор действий. В результате вы будете стирать с обратной стороны вектора, что является гораздо более эффективной операцией. –

Смежные вопросы