1

C++ マップに奇妙な問題があります。

まず、ファイル名をキーとして挿入し、増加する整数を値として挿入します。

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() がファイルマップの特定のキーと同一であることを確認しましたが、マップには見つかりません。

代わりに、要素をマップに挿入する方法を次のように変更した場合 (残りは同じです):

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

...

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

次に、他の関数のマップで特定のキーを見つけることができます。ただし、問題は、ファイルマップに最後の要素のみが含まれ、そのサイズが 1 であることです。マップのキーが上書きされ、最後にマップに「last_element => last_index」が含まれるようです。

これを長い間デバッグしてきましたが、まだ解決できません。どんな助けでも大歓迎です。

4

1 に答える 1

2

const char*へのキーとして使用するにmapは、コンパレータを提供する必要があります。std::map で char* をキーとして使用するを参照してください

より簡単なオプションは、マップをstd::stringキーとして使用するように変更することです。

于 2012-11-24T21:46:26.837 に答える