删除矢量中的重复文件名
Remove duplicate file names in a vector
我有一个程序,它接受输入的文件列表,这些文件保存在一个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::unique
与std::erase
结合使用以删除重复项。
至于引用同一文件的不相同字符串;在Linux上,您可以使用realpath(3)
将所有路径添加到向量(或集合)之前规范化所有路径。我不知道Windows上的等效功能,但我确定有一个。也许尝试搜索 msdn.com,如果你也需要它才能在Windows上工作。
对于便携式解决方案,您可以使用boost::filesystem
:
提升::等效()
返回:true,如果 sf1 == sf2 并且 p1 和 p2 解析为同一文件 系统实体,否则为假。
这样,您将不得不比较每个文件彼此,或者您可以使用 boost::canonical() 或 boost::weekly_canonical() 来规范化路径并使用可能更有效的std::sort
,因为它不必比较每个对。
相关文章:
- 将数组的地址分配给变量并删除
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C/C++编译器通常会删除重复的库吗
- 从命令行c++发送文本文件名
- 从链接列表c++中删除一个项目
- C++如何通过用户输入删除列表元素
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 从文件名变量中删除".txt"
- 谁负责删除FILE_NOTIFY_INFORMATION.文件名
- Qt - 如何在 30 天后删除日志文件,文件名不固定
- 删除矢量中的重复文件名
- 使用[msys]bash删除所有名称与模式匹配的文件,而不考虑文件名字母大小写
- C ++如何从路径字符串中删除文件名
- 如何从cmd NOTEPAD /P删除文件名
- 如何从文件名向量中删除隐藏文件
- 如何访问不需要的保存文件名并删除它
- 从文件名中删除扩展名的简单方法