无法在C ++地图中找到元素

时间:2012-11-24 21:45:14

标签: c++ file-io map

我对C ++ map有一个奇怪的问题。

首先,我将文件名作为键插入,并将增量整数作为值插入:

int getdir (const char* dir, map<const char*, int> &filemap)
{
    DIR *dp;

    struct dirent *dirp;
    if((dp  = opendir(dir)) == NULL) 
    {
        cout << "Error(" << errno << ") opening " << dir << endl;
        return errno;
    }
    int index = 0;
    while ((dirp = readdir(dp)) != NULL) 
    {
        string temp1(dir);
        string temp2(dirp->d_name);

        if(!isalpha(temp2[0]))
        {
            continue;
        }

        filemap[dirp->d_name] = index; 
        index++;
    }

    closedir(dp);
    return 0;
}

然后在另一个函数中,我试图通过以下代码片段查找此映射以查找某个文件名是否存在:

stringstream ss(firststr);
string sourceid;
getline(ss, sourceid, ':');
sourceid = sourceid+".txt";

if(filemap.find(sourceid.c_str())!=filemap.end())
{
   cout<<"found"<<endl;
}

我检查过sourceid.c_str()与filemap中的某个键相同,但在地图中找不到它。

相反,如果我将元素插入地图的方式更改为以下(其余部分相同):

...
string temp1(dir);
string temp2(dirp->d_name);

...

filemap[temp2.c_str()] = index;  //previously is filemap[dirp->d_name] = index;
index++;

然后可以在另一个函数的地图中找到某个键​​。但问题是filemap只包含最后一个元素,其大小为1.似乎地图的键被覆盖,因此最后地图包含“last_element =&gt; last_index”。

我已经调试了很长时间但仍然无法解决它。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

要将const char*用作map的键,您需要提供一个比较器。见Using char* as a key in std::map

更简单的选择是更改地图以使用std::string作为其键。