动态地将字符串插入std :: map

时间:2009-12-21 15:12:05

标签: c++ visual-studio map

我正在尝试创建文件对的映射...首先,我使用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。

你能帮忙解决这个问题......

问候

3 个答案:

答案 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;
}