2012-02-11 3 views
4

Я хотел бы обменять в std::vector как параметр функции, так что вектор не нужно копировать.Swap std :: vector as function parameter

Что-то вроде этого:

function(std::vector<MyType>().swap(my_vector)); 

Или в моем случае, как это:

std::make_pair(0, std::vector<MyType>().swap(my_vector)); 

Но конечно std::vector::swap возвращает пустоту, не созданный вектор.

Есть ли способ сделать это?

+2

Почему вы не используете ссылку? – perreal

+0

@perreal Потому что у меня нет контроля над функцией. ('std :: make_pair') –

+0

@Jay: если функция копирует свой аргумент и вы не можете изменить функцию, невозможно заставить функцию не копировать свой аргумент. (Конечно, в случае 'std :: make_pair' есть версия, которая принимает свои параметры по ссылке rvalue и которая переводит их в конструктор' pair', тем самым перемещая аргумент, а не копируя его (если аргумент rvalue reference)) – Mankarse

ответ

3

Используйте любой современный компилятор, то вы можете использовать std::move, который принимает ваш вектор и возвращает его в качестве RValue:

function(std::move(my_vector)); 

Если это не доступны для вас, вы можете попробовать что-то вроде этого:

template<typename T> 
T Move(T & val) 
{ 
    T ret; 
    ret.swap(val); 
    return ret; 
} 

Дайте мне знать, если вам повезло с этим.

Или, вы можете поменять вектор непосредственно в паре после его создания:

std::pair<int, std::vector<MyType> > p; 
p.second.swap(my_vector); 

Хотя, я думаю, это не поможет вам, если вам нужно возвращаемое значение std::make_pair как RValue.

+0

У меня возникла проблема с настройкой C++ 11x в моей среде, поэтому я не смог протестировать 'std :: move', но я уверен, что это сработает. Благодарю. –