首页 文章

迭代并比较map <string,vector <string >> c中的值

提问于
浏览
0

我使用boost :: filesystem库在c 17中编写了一个程序,该库将路径作为参数并返回一个映射:

map<string, vector<string>>

其中每个键都是一个目录(boost :: filesystem :: path转换为字符串),每个目录中的每个文件都被推送到值向量 .

首先,我从作为参数给出的路径创建路径向量:

// Method to create vector of paths
vector<path> InToVecsOne(path p, vector<path> v1)
{
  for(auto entry : recursive_directory_iterator(p))
  {
    if(is_directory(entry))
    {
      v1.push_back(entry);
    }
  }
  return v1;
}

然后,我使用向量创建 Map ,如下所示:

// Function takes a vector of paths and returns map of key-value pair path-vector<string>
map<string,vector<string>> FileMap(vector<path> v1, 
map<string,vector<string>> m, vector<string> v2)
{
  for(auto p : v1)
  {
    // iterate over each entry in path p
    for(auto entry : directory_iterator(p)) 
    {
      if(is_regular_file(entry) == true)
      {
        // add file to vector<string>
        v2.push_back(basename(entry) + " "); 
      }
    }
    // convert path to pathname (DirX) string
    string pathname = basename(p); 
    m.insert(make_pair(pathname, v2));
    v2.erase(v2.begin(), v2.end()); // remove contents after iterating
  }
  return m;
}

使用我的沙箱目录作为测试路径,在打印 Map 内容时得到以下输出:

DirA: Z X Y 
DirB: Z X Y 
DirBB: X Y YY 
DirC: Z 
DirCC: ZZ X Y YY

值得注意的是,键是DirA,DirB,DirBB等,值是Z,X,Y等 .

我现在要做的是转换东西,使我的输出看起来像:

X : DirA, DirB, DirBB, DirCC
Y : DirA, DirB, DirBB, DirCC

等等

我认为最好的方法是:1 . 重写map方法,或2.迭代map中的内容,比较值是否与键相关联并将此值添加到新数据结构 .

我不确定哪个会更容易,或者第二个会是什么样子,因此需要一些建议 .

谢谢 .


延期:

在注释创建文件名路径对的映射后,我在从上面的旧映射创建这个新映射后遇到了一个新问题 . 我的功能如下:

// Make new map where file is key, and dir is value. m1 is old map, m2 is new map
map<string,vector<string>> FinalMap(map<string,vector<string>> m1, 
map<string,vector<string>> m2, vector<string> dirnames)
{
  // iterate over each key
  for(map<string,vector<string>>::const_iterator it = m1.begin(); it != m1.end(); ++it)
  {
    string dirname = it->first;
    dirnames.push_back(dirname);

    vector<string> files = it->second;
    // iterate over elements in vector<string> files
    for(auto i : files)
    {
      m2.insert(make_pair(i, dirnames));
    }
    dirnames.erase(dirnames.begin(), dirnames.end());
  }
  return m2;
}

但是,现在我的输出如下:

X : DirA
Y : DirA
YY : DirBB
Z : DirA
ZZ : DirCC

我需要它:

X : DirA, DirB, DirBB

假设文件X在DirA,DirB和DirBB中 . 因此,我必须改变函数FileMap .

2 回答

  • 0

    您在评论中描述的尝试操作不正确 . 它应该如下所示:

    std::map<std::string, std::vector<std::string>> 
    FinalMap(std::map<std::string, std::vector<std::string>>const& folderToFiles)
    {
        std::map<std::string, std::vector<std::string>> fileToFolders;
    
        for (auto const& pr : folderToFiles)
        {
            for (auto const& file : pr.second)
                fileToFolders[file].push_back(pr.first);
        }
    
        return fileToFolders;
    }
    

    而已 . 这将枚举文件夹到文件的每个映射,并创建文件到文件夹的新映射 . 我很确定,是你在找什么 .

  • 0

    您可以使用boost::bimap而不是std :: map,并同时获取Dir - > File和File - > Dir查找 .

    #include <boost/bimap.hpp>
    using file_map = boost::bimap<std::string, boost::bimaps::multi_set_of<std::string>>;
    

    然后,您将插入一个 pathname, filename 对,而不是收集 vector 个文件名以与路径关联 .

    请注意,如果您只使用目录的基本名称,则可能会出现重复项 . 存储整个路径,或两侧 multi_set_of .

相关问题