从Value中获取具有给定值的Map中的元素

时间:2017-05-24 06:06:33

标签: c++ dictionary

我的地图定义为std::map<std::string, textInfo> tempMap; textInfo类有一些属性textsizetextcolortextfont等。 我想从此地图中选择一个与textInfo类中的属性的给定值匹配的项目。

例如,如果地图包含

<"A",textInfo("10","Red","Verdana")>
<"B",textInfo("12","Green","Timesnewroman")>
<"C",textInfo("11","Blue","Cambria")>

我想选择包含&#34; Cambria&#34;的项目。在它textfont属性。 <"C",textInfo("11","Blue","Cambria")>

2 个答案:

答案 0 :(得分:2)

std::find_if应该可以满足您的需求。

示例程序:

#include <iostream>
#include <map>
#include <algorithm>

struct textInfo
{
   std::string textsize;
   std::string textcolor;
   std::string textfont;
};

int main()
{
   std::map<std::string, textInfo> m = 
   {
      {"A", {"10","Red","Verdana"}},
      {"B", {"12","Green","Timesnewroman"}},
      {"C", {"11","Blue","Cambria"}}
   };

   auto iter = std::find_if(m.begin(),
                            m.end(),
                            [](std::pair<std::string, textInfo> const& item)
                            { return (item.second.textfont == "Cambria");});
   if ( iter != m.end() )
   {
      auto& item = iter->second;
      std::cout << item.textsize << ", " << item.textcolor << ", " << item.textfont << std::endl;
   }
}

输出:

11, Blue, Cambria

答案 1 :(得分:0)

您只能通过密钥直接访问地图,这里是您的std :: string。要在值中搜索值或甚至变量,就像在这里一样,你必须迭代整个地图。

std::map<std::string, textInfo>::const_iterator it = tempMap.begin();
for (; it != tempMap.end(); ++it)
{
   if (0 == tempMap[(*it)].textfont.equals("Cambria")) // You could use == operator if it's a std::string
   {
      break; // found
   }
}
// Do something with the found item. If the iterator is tempMap.end(), nothing found!

查看here了解更多信息。