2016-11-02 6 views
-1

C++ 초보자 여기! 나는 CITIES의 벡터로 만들어진 WORLD을 고려중인 코드를 썼다. 이 세상은 nbTimeStep 번 업데이트되었습니다. 여기 내 코드가 어떻게 생겼는지에 대한 대략적인 요약이있다. 독서를 쉽게하기 위해 모든 클래스 이름은 모두 대문자입니다. 함수 ReCreateWorld 프로파일 링 후에벡터를 생성 할 때 여분의 복사를 피하려면 어떻게해야합니까?

WORLD& ReCreateWorld(WORLD& OldWorld, WORLD& NewWorld) 
{ 
    for (int city_index=0 ; city_index < NbCities ; city_index++) 
    { 
    /* Long Process of creating a single 'CITY' called `city` 
    ... 
    ... 
    */ 


    // Add the city to the list of cities (process I am trying to optimize) 
    NewWorld.AddCity(city); 
    } 
    return NewWorld; 
} 

로 정의

// Definition of Class `WORLD` 
class WORLD 
{ 
    private: 
    vector<CITY> cities; 
    public: 
    void AddCity(CITY& city) 
    { 
     cities.push_back(city); 
    } 
} 

// In main 

WORLD world(Arguments); 
for (int time_step=0 ; time_step < nbTimeSteps ; time_step++) 
{ 
    WORLD EmptyWorld; 
    world = ReCreateWorld(world,EmptyWorld); // The object `EmptyWorld` will be returned after being 'filled' with cities. 
} 

는 I 볼 그 프로세스에있어서, AddCity에 시간의 약 20 %. 주어진의 두 사례가 절대로 필요하지 않으므로 각 도시를 복사하는 데 너무 많은 시간을 낭비하게됩니다. 어떻게이 문제를 해결할 수 있습니까? 아주 우아한 아니므로


일부는 내가 ReCreateCities에 빈 WORLD을 통과한다는 사실에 대해 언급 할 수 있습니다. 나는 주로 느린 복사 부분이 줄 cities.push_back(city);에서 발생하고 ReCreateWorldWORLD 인 경우가 아니라는 것을 강조하기 위해 수행했습니다.

+0

답은'CITY'가 어떻게 생겼는지에 달려 있습니다. 이동할 수 있습니까 (이동 생성자가 있습니까)? –

+0

이동 생성자가 무엇인지 확실하지 않으면'CITY'의 이동 생성자는'CITY (CITY &&);', 두 개의 앰퍼샌드가있는)로 선언 된 생성자가됩니다. –

답변

0

저스틴 (Justin)과 다니엘 (Daniel)이 제안한 것처럼 움직이는 사람을 사용하십시오. 예전의 방법은 포인터를 사용하는 것입니다. typedef std :: unique_ptr CITY_PTR; std :: vector cities; 도시의 포인터 만 누릅니다.

emplacehttp://www.cplusplus.com/reference/vector/vector/emplace/과 비슷한 것을 시도하여 c-tor 인수를 직접 전달할 수 있습니다.

+0

감사합니다. [이 게시물] (http : // stackoverflow .com/questions/11572669/move-with-vectorpush-back)도 매우 도움이되었습니다. –