我想找到一种方法来确定文件系统路径元素的2个有序向量之间的特殊交集风格,如下所示。
这些向量中的每一个都包含boost文件系统路径。第一组包含文件名和扩展名。该集合没有前导路径信息,矢量不能有重复
// these filename+exts need to be in fqpnPathList in order for a match
std::vector<fs::path> uniqueNameList = {
"file1.txt", "file2.txt", "file3.txt"
};
这些集合中的第二个包含完全限定路径的列表。第二组可以包含重复的尾随文件名+ exts
// list of fully qualified paths that can contain duplicate filenames+exts
std::vector<fs::path> fqpnPathList = {
"/tmp/file1.txt", "/abc/file1.txt", "/tmp/file3.txt"
};
我需要一种方法来执行一个特殊的集合交集,找到 fqpnPathList 中的所有元素,其文件名为+ strong,来自 uniqueNameList
下面的代码使用一个特殊的比较器,对每个集合的元素进行操作,只使用文件名+ ext作为链接/连接字段来执行交集:
std::vector<fs::path> commonPaths;
std::set_intersection(
fqpnPathList.cbegin(), fqpnPathList.cend(),
uniqueNameList.cbegin(), uniqueNameList.cend(),
std::back_inserter(commonPaths), fileNameOnlyComp);
导致:
"/tmp/file1.txt", "/tmp/file3.txt",
完整的代码清单 - 可在 Coliru 上直播,如下所示。从我对上述问题的描述。
有人可以告诉我如何修复执行交集来修复或更改交叉点代码的代码,这样我就可以列出 fqpnPathList 中的所有元素,其中文件名+扩展名匹配 uniqueNameList 即可。
#include <iostream>
#include <string>
#include <vector>
#include <boost/filesystem.hpp>
namespace fs = boost::filesystem;
template<typename T>
std::ostream& operator<<(std::ostream& os, const std::vector<T>& vec) {
for (auto& el : vec) {os << el << ", "; }
return os;
}
int main()
{
// these filename+exts need to be in fqpnPathList in order for a match
std::vector<fs::path> uniqueNameList = {
"file1.txt", "file2.txt", "file3.txt"
};
std::vector<fs::path> fqpnPathList = {
"/tmp/file1.txt", "/abc/file1.txt", "/tmp/file3.txt"
};
auto fileNameOnlyComp = [](const fs::path& lhs, const fs::path& rhs) {
return lhs.filename().string() < rhs.filename().string();
};
std::sort(uniqueNameList.begin(), uniqueNameList.end(), fileNameOnlyComp);
std::sort(fqpnPathList.begin(), fqpnPathList.end(), fileNameOnlyComp);
std::vector<fs::path> commonPaths;
std::set_intersection(
fqpnPathList.cbegin(), fqpnPathList.cend(),
uniqueNameList.cbegin(), uniqueNameList.cend(),
std::back_inserter(commonPaths), fileNameOnlyComp);
std::cout << commonPaths << std::endl;
}