我使用boost :: filesystem库在c 17中编写了一个程序,该库将路径作为参数并返回一个映射:
map>
其中每个键都是一个目录(boost :: filesystem :: path转换为字符串),每个目录中的每个文件都被推送到值向量 .
首先,我从作为参数给出的路径创建路径向量:
// Method to create vector of paths
vector InToVecsOne(path p, vector 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
map> FileMap(vector v1,
map> m, vector 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
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> FinalMap(map> m1,
map> m2, vector dirnames)
{
// iterate over each key
for(map>::const_iterator it = m1.begin(); it != m1.end(); ++it)
{
string dirname = it->first;
dirnames.push_back(dirname);
vector files = it->second;
// iterate over elements in vector 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 .