2014-09-20 192 views
1

我想解析两个字符串向量并找出匹配的字符串和不匹配的字符串。如何在C++中比较两个数组并返回不匹配的值

什么,我希望得到例子:
输入向量1会是什么样子:字符串1,字符串,STRING3]
输入向量2会是什么样子:[字符串2,STRING3,串,4]

理想的输出:
字符串1:不匹配
字符串2:比赛
STRING3:比赛
串,4:不匹配

目前我使用此代码:

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]; 
    } 
    } 
} 
} 

它匹配的那些伟大工程,但在一切迭代这么多次,
不匹配得到印有大量的人的时代。

我该如何改进?

+3

我想'I = I + +'应该只是'++ i'(同样以'j' obvs)。 – Galik 2014-09-20 04:37:21

+1

也排序第一个数组,并进行二进制搜索与第二个数组作为输入应该会改善您的结果 – 2014-09-20 04:46:58

+4

这可以通过排序和使用set_intersection和set_symmetric_difference来完成。看到这里:http://ideone.com/y0o5St – PaulMcKenzie 2014-09-20 05:26:05

回答

1

最好的代码是你没有写的代码。

如果你拿一个(STL)地图容器,它会照顾你整理和记住你遇到的不同的字符串。

让容器为我们工作。

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

您只有一个循环。 这是只为你一个提示(我的代码并没有考虑到的是,在第二矢量串,4可能存在不止一次,但我让你把它安排到您的具体需求)

#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 
+0

感谢您的帮助! – reklaw 2014-09-20 14:35:34

0
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; 
} 
相关问题