我有两个2d字符串向量。如何搜索另一个向量中是否存在一个向量的一个元素? 我已经尝试过使用 find_if 和 any_of ,但它无效。 谢谢。 这就是我的尝试:
int main(){
vector <vector<string>> reference_state_cell;
vector <vector<string>> input_array;
/* then i put necessary data inside those two 2d vectors*/
for (int f = 0; f < 52; f++){
for (int g = 0; g < 10; g++){
if (any_of(reference_state_cell.begin(), reference_state_cell.end(), bind2nd(equal_to<string>(), input_array[f][g])))
{
cout << ",";
}
else
{
cout << input_array[f][g];
}
}
}
答案 0 :(得分:1)
我建议从第一原则开始。如果您没有any_of
可用,您将如何更改代码?你也可以在几个嵌套的for
循环中遍历第一个向量。
int main()
{
vector <vector <string>> reference_state_cell;
vector < vector<string>> input_array;
/* then i put necessary data inside those two 2d vectors*/
for (int f=0;f<52;f++){
for (int g=0;g<10;g++){
bool found = false;
for (size_t i = 0; i < reference_state_cell.size(); ++i )
{
for ( size_t j = 0; j < reference_state_cell[i].size(); ++j )
{
if ( reference_state_cell[i][j] = input_array[f][g] )
{
found = true;
break;
}
}
}
if ( found )
{
cout << ",";
}
else
{
cout<<input_array[f][g];
}
}
}
}
一旦你开始工作,你可以看到如何通过调用std::any_of
来取代最内层的循环。
int main()
{
vector <vector <string>> reference_state_cell;
vector < vector<string>> input_array;
/* then i put necessary data inside those two 2d vectors*/
for (int f=0;f<52;f++){
for (int g=0;g<10;g++){
bool found = false;
for (size_t i = 0; i < reference_state_cell.size(); ++i )
{
found = any_of(reference_state_cell[i].begin(),
reference_state_cell[i].end(),
[=](std::string const& item){return input_array[f][g] == item;});
if ( found)
{
break;
}
}
if ( found )
{
cout << ",";
}
else
{
cout<<input_array[f][g];
}
}
}
}
一旦你开始工作,你可以考虑用另一个std::any_of
替换现在最内层的循环。请注意,您需要使用lambda函数和两个std::any_of
调用。
int main()
{
vector <vector <string>> reference_state_cell;
vector < vector<string>> input_array;
/* then i put necessary data inside those two 2d vectors*/
for (int f=0;f<52;f++){
for (int g=0;g<10;g++){
bool found =
any_of(reference_state_cell.begin(),
reference_state_cell.end(),
[=](vector<string> const& vs) { return any_of(vs.begin(),
vs.end(),
[=](std::string const& item){return input_array[f][g] == item;});
); }) 如果(找到) { cout&lt;&lt; &#34;&#34 ;; } 其他 { COUT&LT;
如果向量很大,并且使用两个for循环(使用std::any_of
隐藏循环,它不会将它们带走)搜索每个项目是昂贵的,您可能想要创建std::set<std::string>
以提高效果。
int main()
{
vector <vector <string>> reference_state_cell;
vector < vector<string>> input_array;
/* then i put necessary data inside those two 2d vectors*/
// Construct a set of strings.
std::set<std::string> stringSet;
for ( auto const& vs : reference_state_cell)
for ( auto const& item : vs )
stringSet.insert(item);
for (int f=0;f<52;f++){
for (int g=0;g<10;g++){
bool found = any_of(stringSet.begin(),
stringSet.end(),
[=](std::string const& item){return input_array[f][g] == item;});
if ( found )
{
cout << ",";
}
else
{
cout<<input_array[f][g];
}
}
}
}
答案 1 :(得分:0)
这里“reference_state_cell”是2D矢量。但是在你的代码中你永远不会以第二种方式访问它。
你可以试试......
any_of(reference_state_cell[index].begin(),reference_state_cell[index].end(),bind2nd(equal_to<string>(),input_array[f][g])))