#include <iostream>
using namespace std;
void insertValue(map<string, set<string> >& myMap,
string const& key,
string const& value)
{
// Check whether there is already a set given the key.
// If so, insert to the existing set.
// Otherwise, create a set and add it to the map.
map<string, set<string> >::iterator found = myMap.find(key);
if (found != myMap.end())
{
cout << "Adding '" << value << "' to an existing set of " << key << "s.\n";
found->second.insert(value);
}
else
{
cout << "Adding '" << value << "' to a new set of " << key << "s.\n";
set<string> temp;
temp.insert(value);
myMap.insert(make_pair(key, temp));
}
}
int main()
{
map<string, set<string> > filemap;
insertValue(mymap, "file1", "path1");
insertValue(mymap, "file1", "path2");
insertValue(mymap, "file1", "path3");
insertValue(mymap, "file2", "path1");
insertValue(mymap, "file3", "path2");
return 0;
}
任何人都可以告诉我如何迭代字符串集,给出上面地图中的一个键????或者我必须在值中放置一个迭代器....我无法理解我怎样才能更进一步
答案 0 :(得分:3)
迭代map
的最简单方法是使用基于范围的for
而不是使用迭代器
for(auto const& kv : mymap) {
for(auto const& v : kv.second) {
std::cout << kv.first << ": " << v << '\n';
}
}
kv
是地图const&
的{{1}},value_type
。然后,嵌套的std::pair<const std::string, std::set<std::string>>
语句将迭代for
中的第二个元素。
如果你真的想使用迭代器,那就用这个
pair
除此之外,您的插入值的功能可以简化很多。在插入值之前,无需检查元素是否已存在于for(auto miter = mymap.cbegin(); miter != mymap.cend(); ++miter) {
for(auto siter = miter->second.cbegin(); siter != miter->second.cend(); ++siter) {
std::cout << miter->first << ": " << *siter << '\n';
}
}
中,因为map
将构造传递给它的键(如果尚不存在),并且相应的值类型将为值已初始化。所以你的map::operator[]
函数就变成了一个单行。
insertValue
最后,除非您需要订购与键对应的值,否则您可以使用multimap
。此容器与void insertValue(map<string, set<string> >& myMap,
string const& key,
string const& value)
{
myMap[key].insert(value); // default construct a set for a new key
}
类似,但您可以拥有与单个键值对应的多个值。但是,与您的解决方案不同,具有相同键的值的顺序是它们的插入顺序。