我想一次在矢量中搜索多个字符串。
即vector =“H”“H”“我”“我” vector2 =“H”“我”
所以我想用vector2的内容搜索向量我的代码在下面,但我不认为这是最好的方法。如果所有字符串都存在,则返回一个标识符,以便我知道所有字符串都存在。
有人可以检查下面的代码,看看它是否正确:)谢谢
std::vector<std::string> test;
test.push_back("YES");
test.push_back("YES");
test.push_back("NO");
test.push_back("NO");
std::vector<std::string> test1;
test1.push_back("YES");
test1.push_back("NO");
std::vector<std::string>::iterator it;
for(int i = 0; i < test1.size(); i++)
{
if(find (test.begin(), test.end(),test[i]) != test.begin() )
{
DCS_LOG_DEBUG("Some elements have appeared more than once...");
}
}
答案 0 :(得分:2)
比较不正确。如果要检查容器中是否至少有一个元素而不是:
if(find(test.begin(), test.end(),test[i]) != test.begin())
你应该使用:
if(find(test.begin(), test.end(),test1[i]) != test.end())
because find
returns test.end()
当它找不到匹配时。
如果您想检查是否存在多个元素,请使用count
:
if(count(test.begin(), test.end(),test1[i]) > 1)
答案 1 :(得分:1)
问题可能是:
if(find (test.begin(), test.end(),test[i]) != test.begin() )
而不是
if(find (test.begin(), test.end(),test1[i]) != test.end() )
您的版本在test
内查找test
的元素,它们将始终返回有效的迭代器。
除此之外,当您发现不存在的string
时,您可以从循环中break
,无需继续搜索,对吧?
答案 2 :(得分:1)
如果您可以对这两个向量进行排序,则可以使用std::includes
。
答案 3 :(得分:1)
让我添加一个不包含明确的解决方案,并假设:
您正在寻找测试中包含的完全相同的字符串。
#include <vector>
#include <string>
#include <algorithm>
#include <iostream>
using namespace std;
struct StringFoundCounter
{
StringFoundCounter(const vector<string>& haystack)
: sum(0), haystack(haystack) { }
void operator()(string needle) {
if (find(haystack.begin(), haystack.end(), needle) != haystack.end())
sum++;
}
int get_sum() const { return sum; }
private:
int sum;
const vector<string>& haystack;
};
int main()
{
std::vector<std::string> test;
test.push_back("YES");
test.push_back("YES");
test.push_back("NO");
test.push_back("NO");
std::vector<std::string> test1;
test1.push_back("YES");
test1.push_back("NO");
test1.push_back("CR");
StringFoundCounter sfc =
for_each(test1.begin(), test1.end(), StringFoundCounter(test));
if (test1.size() == sfc.get_sum())
cout << "All elements found" << endl;
else
cout << "Some or all elements not found" << endl;
}
〜
答案 4 :(得分:0)
我也需要类似的东西,所以写了几行对我来说效果很好。
// allCollectableItems is a vector<string> containing all strings to be searched
// itemsCollected is a vector<string> in which allCollectableItems are to be looked for
bool allItemsFound = true;
for (string item : allCollectableItems)
{
if (std::find(itemsCollected.begin(), itemsCollected.end(), item) == itemsCollected.end())
{
allItemsFound = false;
break;
}
}
// allItemsFound will be the required value