ami*_*421 6 c++ regex lambda boost-filesystem
我正在尝试将解析出的文件名从正则表达式匹配转移到filesystem::path对象列表.
我相信匹配是有效的,因为for_each对于相同的迭代器和打印到控制台工作完美.但是,我遇到运行此代码的分段错误.我究竟做错了什么?我的lambda有错吗?
namespace fs = boost::filesystem;
std::forward_list<fs::path> results;
std::transform(std::sregex_iterator(file_data.begin(), file_data.end(), re),
std::sregex_iterator(), results.begin(),
[&](const std::smatch& m)->fs::path{
return root / fs::path(m[1].str());
});
Run Code Online (Sandbox Code Playgroud)
GDB向我展示了这一行作为错误的地方:
path& operator=(const path& p)
{
m_pathname = p.m_pathname;
return *this;
}
Run Code Online (Sandbox Code Playgroud)
更新:找到解决方案 - 使用back_inserter(results)而不是results.begin().但是,为什么呢?
该std::transform算法的第三个参数应该是一个迭代器,其中的值应写入范围的开始.具体来说,它通过使用转换后的值覆盖迭代器指向的范围内的值来工作.这意味着实际上必须在那里覆盖值才能覆盖.在你的情况下,你写的是空的forward_list,所以没有什么可写的,因此崩溃.
要解决此问题,请考虑使用a替换最后一个参数back_inserter,这将自动创建生成值时所需的空间:
std::transform(std::sregex_iterator(file_data.begin(), file_data.end(), re),
std::sregex_iterator(),
back_inserter(results), // <--- This is new
[&](const std::smatch& m)->fs::path{
return root / fs::path(m[1].str());
});
Run Code Online (Sandbox Code Playgroud)
更一般地说,据我所知,<algorithm>写入输出范围的所有算法都假设有可用于覆盖该范围的值.如果不是这种情况,请考虑使用一种back_inserter或其他类型的插入迭代器,它将自动创建您需要的空间.
希望这可以帮助!