删除向量中的重复文件名

时间:2016-06-21 18:13:14

标签: c++

我有一个程序可以输入一个文件列表,这些文件保存在std::vector中:

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

用户可以完全自由地输入任何文件名(它们来自argv),如果输入引用同一文件的文件名,程序应该忽略重复项。 问题是用户甚至可以使矢量具有如下内容:

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

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

我必须使用fopen()std::ifstream)打开它们。

在开始进程之前检查所有程序fopen()的所有文件,所以这不是问题。

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

2 个答案:

答案 0 :(得分:2)

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

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

对于引用同一文件的非相同字符串;在Linux上,您可以使用realpath(3)规范化所有路径,然后再将它们添加到向量(或集合)中。我不知道Windows上的等效功能,但我确定有一个功能。如果您还需要在Windows上使用它,可以尝试在msdn.com上搜索。

答案 1 :(得分:0)

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

boost::equivalent()

  

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

这样您就必须将每个文件相互比较,或者您可以使用boost::canonical()boost::weekly_canonical()来规范化路径并使用std::sort,因为它不会更有效必须比较每一对。