有一个vector变量std::vector<std::string> fileList,里面存的是文件路径名,请帮我写一个函数,根据路径排序
时间: 2024-01-21 09:02:41 浏览: 108
当您想要根据文件路径名对`fileList`进行排序时,您可以使用`std::sort`算法和自定义的比较函数。下面是一个示例函数来实现这个功能:
```cpp
#include <algorithm>
#include <vector>
#include <string>
bool pathComparator(const std::string& a, const std::string& b) {
return a < b;
}
void sortFilePaths(std::vector<std::string>& fileList) {
std::sort(fileList.begin(), fileList.end(), pathComparator);
}
```
在上面的代码中,`pathComparator`是一个自定义的比较函数,用来比较两个文件路径名的大小关系。在这个例子中,我们使用了字符串的 `<` 操作符来进行比较,这将按照字典顺序对字符串进行排序。
然后,`sortFilePaths`函数接受一个引用类型的`fileList`向量,并使用`std::sort`算法对其进行排序。排序时使用了自定义的比较函数`pathComparator`。请注意,`sortFilePaths`函数会直接修改传入的向量,而不是返回一个新的排序后的向量。
您可以调用`sortFilePaths(fileList)`来对`fileList`中的文件路径进行排序。
相关问题
在Android中写一段java代码使用dhash算法找出List<File> fileList这个fileList中所有具有相似图片的图片文件,并将它们保存在Map<String, List<String>>中
以下是使用dhash算法在Android中找出具有相似图片的文件的Java代码,将它们保存在Map<String, List<String>>中:
```java
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class DHashAlgorithm {
// DHash算法的阈值
private static final int THRESHOLD = 5;
// 获取图片的dhash值
private static String getDHash(File file) {
Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
bitmap = Bitmap.createScaledBitmap(bitmap, 9, 8, true);
int[] pixels = new int[bitmap.getWidth() * bitmap.getHeight()];
bitmap.getPixels(pixels, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());
StringBuilder sb = new StringBuilder();
for (int i = 0; i < pixels.length; i++) {
sb.append((pixels[i] & 0xff) > (pixels[i + 1] & 0xff) ? "1" : "0");
}
String dHash = "";
for (int i = 0; i < sb.length(); i += 4) {
int decimal = Integer.parseInt(sb.substring(i, i + 4), 2);
dHash += Integer.toHexString(decimal);
}
return dHash;
}
// 计算dhash值之间的汉明距离
private static int getHammingDistance(String dHash1, String dHash2) {
int hammingDistance = 0;
for (int i = 0; i < dHash1.length(); i++) {
if (dHash1.charAt(i) != dHash2.charAt(i)) {
hammingDistance++;
}
}
return hammingDistance;
}
// 找出具有相似图片的文件,并将它们保存在Map<String, List<String>>中
public static Map<String, List<String>> findSimilarImages(List<File> fileList) {
Map<String, List<String>> imageMap = new HashMap<>();
for (int i = 0; i < fileList.size(); i++) {
File file1 = fileList.get(i);
String dHash1 = getDHash(file1);
List<String> similarImages = new ArrayList<>();
for (int j = i + 1; j < fileList.size(); j++) {
File file2 = fileList.get(j);
String dHash2 = getDHash(file2);
int hammingDistance = getHammingDistance(dHash1, dHash2);
if (hammingDistance <= THRESHOLD) {
similarImages.add(file2.getAbsolutePath());
}
}
if (similarImages.size() > 0) {
imageMap.put(file1.getAbsolutePath(), similarImages);
}
}
return imageMap;
}
}
```
使用方法:
```java
List<File> fileList = new ArrayList<>();
fileList.add(new File("/path/to/image1.jpg"));
fileList.add(new File("/path/to/image2.jpg"));
fileList.add(new File("/path/to/image3.jpg"));
Map<String, List<String>> imageMap = DHashAlgorithm.findSimilarImages(fileList);
```
其中,fileList是包含所有图片文件的列表,imageMap是保存具有相似图片的文件的Map对象。如果两张图片的dhash值之间的汉明距离小于等于THRESHOLD(默认为5),则认为它们是相似的。
//读取文件列表函数 int readFileList(const char *basePath, std::vector<std::string> &vfilename, std::vector<std::string> &vfile) { DIR *dir; struct dirent *ptr; char base[1000]; if ((dir = opendir(basePath)) == NULL) { perror("Open dir error..."); exit(1); } while ((ptr = readdir(dir)) != NULL) { if (strcmp(ptr->d_name, ".") == 0 || strcmp(ptr->d_name, "..") == 0) /// current dir OR parrent dir continue; else if (ptr->d_type == 8) /// file { char ch[256]; snprintf(ch, 256, "%s/%s", basePath, ptr->d_name); vfilename.push_back(ptr->d_name); std::string d_name(ch); vfile.push_back(d_name); printf("%s\n", d_name.c_str()); } // else if (ptr->d_type == 10) ///link file // printf("d_name:%s/%s\n", basePath, ptr->d_name); // else if (ptr->d_type == 4) ///dir // { // memset(base, '\0', sizeof(base)); // strcpy(base, basePath); // strcat(base, "/"); // strcat(base, ptr->d_name); // readFileList(base); // } } closedir(dir); return 1; } 优化下上面代码
&fileList)
{
DIR *dir;
struct dirent *ptr;
char base[1000];
if ((dir = opendir(basePath)) == NULL)
{
perror("Open dir error...");
exit(1);
}
while ((ptr = readdir(dir)) != NULL)
{
if (strcmp(ptr->d_name, ".") == 0 || strcmp(ptr->d_name, "..") == 0)
continue;
else if (ptr->d_type == DT_DIR)
{
memset(base, '\0', sizeof(base));
snprintf(base, sizeof(base), "%s/%s", basePath, ptr->d_name);
readFileList(base, fileList);
}
else
{
fileList.push_back(ptr->d_name);
}
}
closedir(dir);
return 0;
}
// 该函数实现了递归遍历指定目录下的所有文件,并将文件名存入到std::vector<std::string>类型的fileList变量中。其中,basePath为要遍历的目录路径,fileList为存放文件名的vector容器。
阅读全文