2017-03-02 56 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 (上面的例子是从参考直接)

无论是一个可以做这取决于你正在尝试做的工作。