【问题标题】:How to compare two arrays and return non matching values in C++如何在 C++ 中比较两个数组并返回不匹配的值
【发布时间】:2014-09-20 04:29:19
【问题描述】:

我想解析两个字符串向量,找出相互匹配的字符串和不匹配的字符串。

我想要得到的示例:
输入向量 1 看起来像:[string1, string2, string3]
输入向量 2 看起来像:[string2, string3, string4]

理想输出:
string1:不匹配
string2:匹配
string3: 匹配
string4: 不匹配

目前我使用此代码:

vector<string> function(vector<string> sequences, vector<string> second_sequences){

 for(vector<string>::size_type i = 0; i != sequences.size(); i++) {
  for(vector<string>::size_type j = 0; j != second_sequences.size(); j++){
   if (sequences[i] == second_sequences[j]){
     cout << "Match: " << sequences[i];
    }else{
     cout << "No Match: " << sequences[i];
     cout << "No Match: " << second_sequences[j];
   }
  }
 }  
}

它非常适合匹配的那些,但会多次迭代所有内容,
不匹配的会被打印很多次。

我该如何改进?

【问题讨论】:

  • 我认为i = i++ 应该只是++i(与j obvs 相同)。
  • 还对第一个数组进行排序并与第二个数组进行二分搜索作为输入应该会改善您的结果
  • 这可以通过排序和使用 set_intersection 和 set_symmetric_difference 来完成。见这里:ideone.com/y0o5St
  • 我链接到的实现不仅可以正常工作,而且时间复杂度比您尝试使用的双嵌套循环更快。底线是——如果你正在编写一个听起来像是以前做过的函数,那么很可能有算法函数可以完成这项工作。在给定两个序列的情况下查找不匹配或相同的项目是经常要做的事情,因此有执行此类任务的算法函数。

标签: c++ vector


【解决方案1】:

最好的代码是你不必编写的代码。

如果您使用 (STL) 地图容器,它会照顾您对遇到的不同字符串进行排序和记忆。

所以让容器为我们工作吧。

我建议快速编写一个小代码。您需要此语法至少启用编译器的 C++ 2011 选项(例如 gcc 上的 -std=c++11 )。在 C++11 之前应该使用的语法要冗长得多(但应该从学者的角度知道)。

你只有一个循环。 这只是给你的一个提示(我的代码没有考虑到在第二个向量中 string4 可能不止一次出现,但我让你根据你的确切需要安排它)

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


using namespace std;


vector<string> v1 { "string1","string2","string3"};
vector<string> v2 { "string2","string3","string4"};

//ordered map will take care of "alphabetical" ordering
//The key are the strings
//the value is a counter ( or could be any object of your own
//containing more information )
map<string,int> my_map;

int main()
{
    cout << "Hello world!" << endl;

    //The first vector feeds the map before comparison with
    //The second vector
    for ( const auto & cstr_ref:v1)
        my_map[cstr_ref] = 0;

    //We will look into the second vector ( it could also be the third,
    //the fourth... )
    for ( const auto & cstr_ref:v2)
    {
        auto iterpair = my_map.equal_range(cstr_ref);

        if ( my_map.end() != iterpair.first )
        {
            //if the element already exist we increment the counter
            iterpair.first->second += 1;
        }
        else
        {
            //otherwise we put the string inside the map
            my_map[cstr_ref] = 0;
        }

    }

    for ( const auto & map_iter: my_map)
    {
        if ( 0 < map_iter.second )
        {
            cout  << "Match    :";
        }
        else
        {
            cout  << "No Match :" ;
        }

        cout << map_iter.first << endl;
    }


    return 0;
}

输出:

No Match :string1
Match    :string2
Match    :string3
No Match :string4

【讨论】:

    【解决方案2】:
    std::sort(std::begin(v1), std::end(v1));
    std::sort(std::begin(v2), std::end(v2));
    
    std::vector<std::string> common_elements;
    std::set_intersection(std::begin(v1), std::end(v1)
                        , std::begin(v2), std::end(v2)
                        , std::back_inserter(common_elements));
    
    for(auto const& s : common_elements)
    {
        std::cout<<s<<std::endl;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      • 2017-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多