繁体   English   中英

如何将2个char *数组直接映射到std :: map <std::string,std::string>

[英]How to map 2 char* arrays directly into std::map<std::string,std::string>

我有2个字符数组,例如“ const char * arr1 [ArrSize] = {“ Blah1”,“ Wibble1”,“ Shrug1”};“。 为了将它们放入向量,我找到了一个不错的快速解决方案:

void fillVecTest()
{
    const int ArrSize = 3;
    const char *arr1[ArrSize] = {"Blah1", "Wibble1", "Shrug1"};
    const char *arr2[ArrSize] = {"Blah2", "Wibble2", "Shrug2"};
    std::vector<std::string> vec1(arr1, arr1+ArrSize);
    std::vector<std::string> vec2(arr2, arr2+ArrSize);
    std::vector<std::string>::iterator l_It1Vec1;
    std::vector<std::string>::iterator l_It = vec1.end();
    l_It = find(vec1.begin(), vec1.end(), std::string("Blah1"));
    if(l_It != vec1.end())
    {
      size_t l_pos = l_It - vec1.begin();
      printf("found %s, pos=%u val: %s\n", l_It->c_str(),l_pos, vec2[l_pos].c_str());
    }
 }

现在,我认为也可以将两者直接放入地图中,因为arr1是键,而arr2是值。 我尝试了一些方法,但没有成功。

void fillMapTest()
{
    const int ArrSize = 3;
    const char *arr1[ArrSize] = {"Blah1", "Wibble1", "Shrug1"};
    const char *arr2[ArrSize] = {"Blah2", "Wibble2", "Shrug2"};
    std::map<std::string,std::string> map1;//(pair(arr1,arr1), pair(arr1+ArrSize,arr2+ArrSize));
    std::map<std::string,std::string>::iterator l_It1Map1;
    //l_It1Map1 = find(map1.begin(), map1.end(), std::string("Blah1"));
    if(l_It1Map1 != map1.end())
    {
      printf("found key: %s, val: %s\n",l_It1Map1->first.c_str(), l_It1Map1->second.c_str());
    }

}


int _tmain(int /*argc*/, _TCHAR* /*argv[]*/)
{
  fillVecTest();
  fillMapTest();
  return 0;
}

我认为只需要解决函数“ fillMapTest”中的注释行。 构造师发现并不能按我想要的方式工作。

请让STL专家有个好主意吗?

编写此代码最简单的方法:

std::map<std::string, std::string> m {
    { "key1", "value1" },
    { "key2", "value2" },
};

这要求您的编译器支持初始化程序列表 (C ++ 11的功能)。

std::map<std::string, std::string> m;

for(int i = 0; i < ArrSize; i++) {
    std::pair<std::string, std::string> p =
        std::make_pair(std::string(arr1[i]), std::string(arr2[i]));
    m.insert(p);
}

如果您真的想使用map构造函数,则需要一个成对的迭代器,唯一的方法(我知道)是使用std::vector<std::pair<std::string, std::string> >::iterator但这似乎是获得相同结果的不必要的额外步骤。

#include <vector>
#include <map>
#include <string>

std::vector<std::pair<std::string, std::string> > values;

for(int i = 0; i < ArrSize; i++) {
    std::pair<std::string, std::string> p =
        std::make_pair(std::string(arr1[i]), std::string(arr2[i]));
    values.push_back(p);
}

std::map<std::string, std::string> m(values.begin(), values.end());
for(int i = 0; i < ArrSize; i++) {
    m.insert(pair<string, string>(arr1[i], arr2[i]));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM