我正在尝试创建文件对的映射...首先,我使用FindFirstFile和FindNextFile在指定的目录中搜索文件,当找到文件时,我搜索地图以查看相关文件是否存在。如果另一个文件已添加到地图中,则新找到的文件将插入到先前找到的文件旁边。如果未找到关联文件,则会将新文件插入到地图中,并保持其对完整。
要解释更多: 假设我们有2个文件file.1.a和file.1 这些文件代表一对,因此应作为一对
添加到地图中//map<File w/o .a, File w .a>
std::map<CString, CString> g_map;
int EnumerateFiles(LPCTSTR Dir)
{
//Search Files....
//Found a File....(for ex: file.1)
//Append .a to the string and search for it in the map
BOOL bAdded = FALSE;
for(std::map<CString, CString>::iterator itr = g_map.begin(); itr != g_map.end(); itr++)
{
if(StrCmp(tchAssocFile, itr->second) == 0)
{
bAdded = TRUE;
//pair the string with the other one;
}
}
if(!bAdded)
//Add the new string to the map and leave its associate blank
//Do the same in reverse if the associate was found first....
}
我希望这很清楚,因为我无法想到任何其他的方式来表达它...... sry。
你能帮忙解决这个问题......
问候
答案 0 :(得分:4)
你有两个文件 {X}和{X} .a
您想要搜索一些目录空间并存储您找到的目录空间。
让我们将查找的信息存储在std :: pair&lt; bool,bool&gt;中。
第一个值表示如果我们找到{x},则第二个值代表{x} .a
这些对值使用{X}作为地图的索引存储在地图中。
#include <memory>
#include <string>
#include <map>
typedef std::pair<bool,bool> FileInfo;
typedef std::map<std::string,FileInfo> FileMapInfo;
FileMapInfo fileMapInfo;
void found(std::string const& fileName)
{
// baseName: We will use this to lookup if either file is found.
// The extension ".a" is removed from this name.
// aExtension: is true if the file ends with ".a"
std::string baseName(fileName);
bool aExtension(false);
std::string::size_type pos = fileName.find_last_of(".a");
if ((pos != std::string::npos) && (pos == fileName.size()-2))
{
// Get the real base
baseName = fileName.substr(0,fileName.size() - 2);
aExtension = true;
}
// This looks up the record about the file(s).
// If it dies not exist it creates an entry with false,false.
FileInfo& fileInfo = fileMapInfo[baseName];
// Now set the appropriate value to true.
if (!aExtension)
{
fileInfo.first = true;
}
else
{
fileInfo.second = true;
}
}
int main()
{
// loop over files.
// call found(<fileName>);
}
答案 1 :(得分:1)
如果效率是一个问题,您必须维护两个地图(对于两个查询方向,或使用双向地图(如this one)。
但是看看你的问题,我认为两套(std :: set)可能效果更好。你把找到的.a文件放到另一个非a文件中,最后你拿它们的std ::交集:)。
答案 2 :(得分:0)
我想我会做这样的事情:
string tchFile = <name of file you just found>;
string tchAssocFile = <name of associated file if it exists, empty otherwise>;
if (tchAssocFile.empty())
g_map[tchFile] = "";
else {
std::map<string, string>::iterator foundAssocIter = g_map.find(tchAssocFile);
if (foundAssocIter != g_map.end())
foundAssocIter->second = tchFile;
else
g_map[tchFile] = tchAssocFile;
}