2017-03-02 60 views
1

我想看看向量v1是否在向量v2內。例如,如果v1 =(b,a)和v2 =(g,e,f,a,b)。我需要在v2中檢查b和一個禮物。搜索另一個向量內的向量

我下面的代碼只有在訂單相同時纔會幫助我。

std::search(v2.begin(), v2.end(), v1.begin(), v1.end()); 

即,如果V2 =(G,E,F,B,A)

目前我通過以下方式

for (std::vector<std::string>::iterator it = v1.begin(); it != v1.end(); ++it) 
{ 
    if (std::find(v2.begin(), v2.end(), *it) != v2.end()) 
     std::cout << "found\n"; 
    else 
     std::cout << "not found\n"; 
} 

實現有一種方法來實現使用上述使用std :: search?

回答

3

你可以使用std::set_intersection

#include <iostream> 
#include <vector> 
#include <algorithm> 
#include <iterator> 
int main() 
{ 
    std::vector<char> v1{'a','b','e','f','g'}; 
    std::vector<char> v2{'a','b'}; 
    std::sort(v1.begin(), v1.end()); 
    std::sort(v2.begin(), v2.end()); 

    std::vector<char> v_intersection; 

    std::set_intersection(v1.begin(), v1.end(), 
          v2.begin(), v2.end(), 
          std::back_inserter(v_intersection)); 
    for(int n : v_intersection) 
     std::cout << n << ' '; 
} 

See the reference

請注意,這是必需的,這兩個向量都使用相同的排序功能排序利用std::set_intersection,因爲它依賴於使用operator<比較元素之前,

此外,您可以使用std::includes

#include <iostream> 
#include <algorithm> 
#include <cctype> 
#include <vector> 

int main() 
{ 
    std::vector<char> v1 {'a', 'b', 'c', 'f', 'h', 'x'}; 
    std::vector<char> v2 {'a', 'b', 'c'}; 
    std::vector<char> v3 {'a', 'c'}; 
    std::vector<char> v4 {'g'}; 
    std::vector<char> v5 {'a', 'c', 'g'}; 

    for (auto i : v1) std::cout << i << ' '; 
    std::cout << "\nincludes:\n" << std::boolalpha; 

    for (auto i : v2) std::cout << i << ' '; 
    std::cout << ": " << std::includes(v1.begin(), v1.end(), v2.begin(), v2.end()) << '\n'; 
    for (auto i : v3) std::cout << i << ' '; 
    std::cout << ": " << std::includes(v1.begin(), v1.end(), v3.begin(), v3.end()) << '\n'; 
    for (auto i : v4) std::cout << i << ' '; 
    std::cout << ": " << std::includes(v1.begin(), v1.end(), v4.begin(), v4.end()) << '\n'; 
    for (auto i : v5) std::cout << i << ' '; 
    std::cout << ": " << std::includes(v1.begin(), v1.end(), v5.begin(), v5.end()) << '\n'; 

    auto cmp_nocase = [](char a, char b) { 
    return std::tolower(a) < std::tolower(b); 
    }; 

    std::vector<char> v6 {'A', 'B', 'C'}; 
    for (auto i : v6) std::cout << i << ' '; 
    std::cout << ": (case-insensitive) " 
      << std::includes(v1.begin(), v1.end(), v6.begin(), v6.end(), cmp_nocase) 
      << '\n'; 
} 

OUTPUT:

a b c f h x 
includes: 
a b c : true 
a c : true 
g : false 
a c g : false 
A B C : (case-insensitive) true 

Here is the reference page (上面的例子是從參考直接)

無論是一個可以做這取決於你正在嘗試做的工作。