【发布时间】:2011-06-06 03:12:04
【问题描述】:
我正在使用 Boost.Filesystem 在目录中创建文件列表。我使用boost::filesystem::recursive_directory_iterator 和std::copy 将每个路径作为boost::filesystem::directory_entry 对象放入std::vector 中。我希望作为 std::strings 输出到文件,所以我做了以下 (\n 以避免使用
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)。
【问题讨论】: