将字符串文件路径转换为唯一标识符。
这是我需要转换为唯一ID的文件路径。(首选int)
D:\Images\PSSL\2019\Team_Colours\Base_1\Generic.png
D:\Images\Generic.png
D:\Images\Generic\Images\2019\Base.png
从图像到图像的路径会有所警惕
因为我对如何进行操作有点迷茫而没有张贴任何代码的策略
答案 0 :(得分:2)
您的字符串不是路径,而是路径,如果相应的文件/目录始终存在,则可以使用其节点号(d_ino
中的字段struct dirent
)
注意: dirent 在Linux / Unix / Windows上可用,如果由于编译器而没有,请使用List of all files inside the folder and its subfolders in Windows
如果文件/目录可能不存在,则可以自己创建字典字符串-> int,例如:
#include <iostream>
#include <string>
#include <map>
#include <list>
class UI {
public:
UI() : next(1) {}
unsigned search(std::string) const;
unsigned get(std::string);
unsigned forget(std::string);
private:
std::map<std::string, unsigned> m;
std::list<unsigned> free;
unsigned next;
};
unsigned UI::search(std::string s) const {
std::map<std::string, unsigned>::const_iterator it = m.find(s);
return (it == m.end()) ? 0 : it->second;
}
unsigned UI::get(std::string s) {
std::map<std::string, unsigned>::const_iterator it = m.find(s);
if (it != m.end())
return it->second;
unsigned r;
if (!free.empty()) {
r = free.front();
free.pop_front();
}
else
r = next++;
m[s] = r;
return r;
}
unsigned UI::forget(std::string s) {
std::map<std::string, unsigned>::const_iterator it = m.find(s);
if (it == m.end())
return 0;
unsigned r = it->second;
m.erase(it);
if (r == (next - 1))
next -= 1;
else
free.push_back(r);
return r;
}
int main(void)
{
UI ui;
std::cout << "aze " << ui.search("aze") << std::endl;
std::cout << "aze " << ui.get("aze") << std::endl;
std::cout << "qsd " << ui.get("qsd") << std::endl;
ui.forget("aze");
std::cout << "aze " << ui.search("aze") << std::endl;
std::cout << "wxc " << ui.get("wxc") << std::endl;
return 0;
}
编译和执行:
pi@raspberrypi:/tmp $ g++ -pedantic -Wall -Wextra c.cc
pi@raspberrypi:/tmp $ ./a.out
aze 0
aze 1
qsd 2
aze 0
wxc 1
pi@raspberrypi:/tmp $
注意:
我不检查输入新字符串时是否已经使用了 unsigned int 的所有可能的值,否则在这种情况下您会遇到内存问题,或者使用64b未签名以确保;-)
字符串的ID肯定是唯一的,但取决于历史记录,哈希值不取决于历史记录,但几个字符串可能具有相同的哈希值