使用公共链接字段的特殊集合交集

时间:2015-11-19 22:00:15

标签: c++ algorithm stl

我想找到一种方法来确定文件系统路径元素的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;
} 

0 个答案:

没有答案