我想在矢量 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*/)
答案 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";
}
答案 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;
}