如何找出2d向量中是否存在一个元素?

时间:2017-05-13 06:39:41

标签: c++ vector

我有两个2d字符串向量。如何搜索另一个向量中是否存在一个向量的一个元素? 我已经尝试过使用 find_if any_of ,但它无效。 谢谢。 这就是我的尝试:

int main(){
    vector <vector<string>> reference_state_cell;
    vector <vector<string>> input_array;

    /* then i put necessary data inside those two 2d vectors*/

    for (int f = 0; f < 52; f++){
        for (int g = 0; g < 10; g++){
            if (any_of(reference_state_cell.begin(), reference_state_cell.end(), bind2nd(equal_to<string>(), input_array[f][g])))
            {
                cout << ",";
            }
            else
            {
                cout << input_array[f][g];
            }
        }
    }

2 个答案:

答案 0 :(得分:1)

我建议从第一原则开始。如果您没有any_of可用,您将如何更改代码?你也可以在几个嵌套的for循环中遍历第一个向量。

int main()
{   
   vector <vector <string>> reference_state_cell;
   vector < vector<string>> input_array;

   /* then i put necessary data inside those two 2d vectors*/

   for (int f=0;f<52;f++){
      for (int g=0;g<10;g++){

         bool found = false;
         for (size_t i = 0; i < reference_state_cell.size(); ++i )
         {
            for ( size_t j = 0; j < reference_state_cell[i].size(); ++j )
            {
               if ( reference_state_cell[i][j] = input_array[f][g] )
               {
                  found = true;
                  break;
               }
            }
         }

         if ( found )
         {
            cout << ",";
         }
         else
         {
            cout<<input_array[f][g];
         }
      }
   }
}

一旦你开始工作,你可以看到如何通过调用std::any_of来取代最内层的循环。

int main()
{
   vector <vector <string>> reference_state_cell;
   vector < vector<string>> input_array;

   /* then i put necessary data inside those two 2d vectors*/

   for (int f=0;f<52;f++){
      for (int g=0;g<10;g++){

         bool found = false;
         for (size_t i = 0; i < reference_state_cell.size(); ++i )
         {
            found = any_of(reference_state_cell[i].begin(),
                           reference_state_cell[i].end(),
                           [=](std::string const& item){return input_array[f][g] == item;});
            if ( found)
            {
               break;
            }
         }

         if ( found )
         {
            cout << ",";
         }
         else
         {
            cout<<input_array[f][g];
         }
      }
   }
}

一旦你开始工作,你可以考虑用另一个std::any_of替换现在最内层的循环。请注意,您需要使用lambda函数和两个std::any_of调用。

int main()
{
   vector <vector <string>> reference_state_cell;
   vector < vector<string>> input_array;

   /* then i put necessary data inside those two 2d vectors*/

   for (int f=0;f<52;f++){
      for (int g=0;g<10;g++){

         bool found = 
            any_of(reference_state_cell.begin(),
                   reference_state_cell.end(),
                   [=](vector<string> const& vs) { return any_of(vs.begin(),
                                                                 vs.end(),
                                                                 [=](std::string const& item){return input_array[f][g] == item;});

); })              如果(找到)              {                 cout&lt;&lt; &#34;&#34 ;;              }              其他              {                 COUT&LT;

如果向量很大,并且使用两个for循环(使用std::any_of隐藏循环,它不会将它们带走)搜索每个项目是昂贵的,您可能想要创建std::set<std::string>以提高效果。

int main()
{
   vector <vector <string>> reference_state_cell;
   vector < vector<string>> input_array;

   /* then i put necessary data inside those two 2d vectors*/

   // Construct a set of strings.
   std::set<std::string> stringSet;
   for ( auto const& vs : reference_state_cell)
      for ( auto const& item : vs )
         stringSet.insert(item);

   for (int f=0;f<52;f++){
      for (int g=0;g<10;g++){

         bool found = any_of(stringSet.begin(),
                             stringSet.end(),
                             [=](std::string const& item){return input_array[f][g] == item;});
         if ( found )
         {
            cout << ",";
         }
         else
         {
            cout<<input_array[f][g];
         }
      }
   }
}

答案 1 :(得分:0)

这里“reference_state_cell”是2D矢量。但是在你的代码中你永远不会以第二种方式访问​​它。

你可以试试......

any_of(reference_state_cell[index].begin(),reference_state_cell[index].end(),bind2nd(equal_to<string>(),input_array[f][g])))