如何在向量向量中找到元素

时间:2017-11-22 10:36:59

标签: c++

我想在矢量 v 的矢量中找到字符串 x

std::vector<std::string> vA{"A", "B", "C"};
std::vector<std::string> vB{"D", "E", "F"};

std::string x = "E";
std::vector<std::vector<std::string>> v{vA, vB};

如何在我的情况下使用std :: find?你有其他想法吗?

修改一个bool值的结果,表示至少找到了一个“E”。

我想知道是否有可能以某种方式使用std :: find *这样:

std::find*(v.begin(), v.end(), /*lambda with next std::find*/) 

4 个答案:

答案 0 :(得分:3)

使用range-v3,它将是:

auto flat_view = v | ranges::view::join;
auto it = ranges::find(flat_view, x);
if (it != end(flat_view)) {
    std::cout << "found\n";
}

Demo

答案 1 :(得分:2)

保持简单:

for (auto const &stringVector : v) {
    auto it = std::find(std::begin(stringVector), std::end(stringVector), x);
    if (it != std::end(stringVector)) {
         // do what you want
         break;
    }
}

我想发表评论,或许作为旁注。您的标题询问“如何在向量向量中找到元素”。但是,你的问题是“如何使用std::find来处理我的案子?”

你不应该使用std::find因为这就是你应该做的事情。在它有用时使用它,并在它有害时避免使用它。从您的数据开始,而不是从代码开始。

修改

要回答您的修改,您可以使用std::find_if

using namespace std;

bool find_string(vector<vector<string>> const &v, string const &x) {
    return find_if(begin(v), end(v), [&x] (vector<string> const &stringVector) {
        return find(begin(stringVector), end(stringVector), x) == end(stringVector);
    }) != end(v);
}

但在我看来,这个可读性较差。

答案 2 :(得分:1)

如果你只使用指向字符串的指针就可以了:

std::string* foo(const std::vector<std::vector<std::string>>& v, 
                 const std::string_view needle)
{
    for(const auto& inner : v)
        for(const auto& s : inner)
            if(s == needle) return &s;

    return nullptr;
}

如果你想要迭代器:

auto foo(const std::vector<std::vector<std::string>>& v, 
         const std::string_view needle)
{
    for(auto oit = std::begin(v); oit != std::end(v); ++oit)
        for(auto it = std::begin(inner); it != std::end(inner); ++it)
            if(*it == needle) return std::make_pair(oit, it);

    return std::make_pair(std::end(v), decltype(v[0].begin()){});
}

答案 3 :(得分:0)

如何在循环中搜索每个向量然后使用std::find

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

//using namespace std;
int main(){
    std::vector<std::string> vA{"A", "B", "C"};
    std::vector<std::string> vB{"D", "E", "F"};

    std::string x = "E";
    std::vector<std::vector<std::string>> v{vA, vB};

    for(auto inner_vec : v){
        auto res = std::find(std::begin(inner_vec), std::end(inner_vec), x);
        if(res != std::end(inner_vec))
            std::cout << *res;
    }   
    return 0;
}