我使用Boost.Filesystem來創建目錄中的文件列表。我使用boost::filesystem::recursive_directory_iterator
和std::copy
將每個路徑作爲boost::filesystem::directory_entry
對象放入std :: vector中。我想輸出到文件的std ::字符串了,所以我做了以下(\ n要避免使用< <):std ::轉換和移動語義
std::vector<boost::filesystem::directory_entry> buffer; //filled with paths
...
std::vector<std::string> buffer_native(buffer.size());
//transform directory_entry into std::string, and add a \n, so output is formatted without use of <<
std::transform(buffer.begin(),buffer.end(),buffer_native.begin(), [](boost::filesystem::directory_entry de)->std::string
{
std::string temp=de.path().string();
temp+="\n";
return temp;
}
buffer.clear();
std::copy(buffer_native.begin(),buffer_native.end(),std::ostream_iterator<std::string>(out_file));
但是這個問題是,它創建了兩個載體中,原件立即被清除,因爲它不是必需的。這聽起來像是移動語義的完美場所,但n3242僅提供與C++ 98中相同的兩次變換重載。是否可以通過std::transform
實現移動語義?如果不是,編寫自定義循環會更好嗎?
我在Windows XP上使用GCC 4.5.2(MinGW)。
只是幫助編譯器做RVO或通過返回無名的臨時移動:'return de.path()。string()+'\ n';' – 2011-06-06 03:56:09
@Gene:無論如何它會移動它。 – GManNickG 2011-06-06 03:58:25
謝謝。我不知道像'make_move_iterator'這樣的東西甚至存在(我還沒有完全讀過n3242)。我不認爲Boost.Filesystem支持移動語義,但我認爲他們計劃在未來。 – mmoran 2011-06-06 04:44:33