删除矢量中的重复文件名

Remove duplicate file names in a vector

本文关键字:文件名 删除      更新时间:2023-10-16

我有一个程序,它接受输入的文件列表,这些文件保存在一个std::vector中:

std::vector<std::string> fileNames;

用户可以完全自由地输入任何文件名(它们取自argv),如果它输入的文件名引用同一文件,则程序应忽略重复项。 问题是用户甚至可以使向量具有这样的东西:

{
"myfile1.txt",
"/path/to/myfile1.txt",
"/path//to/myfile1.txt"
}

考虑到我从/path/to调用程序,这三个文件名引用同一个文件,但它们是不同的字符串。

我必须用fopen()(而不是std::ifstream)打开它们。

并且在开始其过程之前检查它们的所有程序fopen()所有文件,所以这不是问题。

有没有一种有效的方法来删除重复的文件名?

您可以使用std::set而不是向量来确保相同的字符串只列出一次。

或者,您可以std::sort(或std::stable_sort)载体,然后将std::uniquestd::erase结合使用以删除重复项。

至于引用同一文件的不相同字符串;在Linux上,您可以使用realpath(3)将所有路径添加到向量(或集合)之前规范化所有路径。我不知道Windows上的等效功能,但我确定有一个。也许尝试搜索 msdn.com,如果你也需要它才能在Windows上工作。

对于便携式解决方案,您可以使用boost::filesystem

提升::等效()

返回:true,如果 sf1 == sf2 并且 p1 和 p2 解析为同一文件 系统实体,否则为假。

这样,您将不得不比较每个文件彼此,或者您可以使用 boost::canonical() 或 boost::weekly_canonical() 来规范化路径并使用可能更有效的std::sort,因为它不必比较每个对。