将字符串映射到矢量或将不同的键映射到一个值

时间:2017-05-26 13:04:02

标签: c++ c++11 vector stl unordered-map

我需要将单个字符串映射到多个字符串,为此我想到了两个不同的解决方案:

第一个是将每个字符串映射到一个向量,这样当我看到键时,我得到了向量。 std::unordered_map<std::string, std::vector<std::string>>
使用此解决方案意味着我只需要查找一次键,但我必须迭代数组才能找到所需的正确字符串。

我认为第二个解决方案是使用向量中包含的每个字符串(我知道它们是唯一的)作为键,并将它们映射到解决方案1中的关键字。std::unordered_map<std::string, std::string> <登记/> 使用这个解决方案意味着我需要寻找一个键n次(其中n是解决方案1中数组的长度),而在我的地图中,我有许多键的相同值(我不知道是否重要在最后)但我会直接拥有我需要的字符串。

示例1:

std::unordered_map<std::string, std::vector<std::string>> map;
std::vector<std::string> arr = {"hello", "world"};
map["greetings"] = array;

示例2:

std::unordered_map<std::string, std::string> map;
map["hello"] = "greetings";
map["world"] = "greetings";

出于我的程序的目的,我最终得到的是什么字符串(解决方案1的数组中的值或解决方案2中的值)并不重要,只要我有办法将它们映射到彼此,所以两种解决方案都是可行的 我没有办法提前知道解决方案1中阵列的长度。

这两种解决方案有什么重大差异吗?哪一个更快/在纸上使用更少的内存?

2 个答案:

答案 0 :(得分:2)

您有一个字符串和一系列字符串之间的映射(如果插入顺序不重要,则可能是一组字符串)。尽管你的第二个例子以相反的方式使用它们,让我们调用前面的键和后面的值。

示例一允许您有效地查找与特定键关联的所有值。因此,方法1更快,方法2更慢。

示例2允许您有效地查找特定值映射到的键。因此,方法2更快,方法1更慢。

正如您所看到的,两个示例都比另一个更快。

答案 1 :(得分:0)

你的两个选择做不同的事情。

示例1:

 imageview = (ImageView) findViewById(R.id.imview_camera_setter);
        framelayout = (FrameLayout) findViewById(R.id.frame_layout_viewer);
        try {


            File f=new File(internalpath, "profile.jpg");
            Bitmap b = BitmapFactory.decodeStream(new FileInputStream(f));

            imageview.setImageBitmap(Bitmap.createScaledBitmap(b, 300, 300, false));

        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        }

示例2:

std::unordered_map<std::string, std::vector<std::string>> map;
map["greetings"] = {"hello", "world"};
map["farewells"] = {"goodbye", "cruel", "world"};
for(auto && pair : map) {
   for(auto && value : pair.second) {
      std::cout << pair.first << value;
   }
}

// greetings hello
// greetings world
// farewells goodbye
// farewells cruel
// farewells world