在c ++中我有一个数组,我试图检查数组中是否有某个元素。这是我的阵列:
string choices[3] = {"a", "b", "c"}
我想要它,如果用户输入存在于数组中,它打印出true,所以如果用户输入“b”,那么它将打印为true并给我数组索引。这就像是in或者Python的Python版本。我知道我可以使用for循环遍历所有元素,但是有更有效的方法吗?感谢。
答案 0 :(得分:2)
要查找索引,您可以使用以下代码:
int x = std::distance(choices, std::find(choices, choices + 3, "b"));
此处,distance
和find
方法可以在<algorithm>
标题中找到。
答案 1 :(得分:1)
您可以使用标头std::find
中声明的标准算法<algorithm>
它可以解决两个任务。它可以说一个字符串是否存在于容器中,它可以提供第一个找到的元素的索引。
如果您只需确定容器中是否存在字符串,则可以使用标准算法std::any_of
这两种算法都具有线性复杂性。
如果订购了一个容器(例如数组),那么您可以使用标准算法std::binary_search
来确定容器中是否存在字符串。
演示标准算法std::find
#include <iostream>
#include <iomanip>
#include <string>
#include <algorithm>
#include <iterator>
int main()
{
std::string choices[] = { "a", "b", "c" };
std::cout << "Enter a string: ";
std::string s;
std::cin >> s;
auto it = std::find( std::begin( choices ), std::end( choices ), s );
bool in_array = it != std::end( choices );
std::cout << "String "\" << s << "\" is present in the array = "
<< std::boolalpha << in_array << std::endl;
if ( in_array )
{
std::cout << "It is " << std::distance( std::begin( choices ), it )
<< " element in the array" << std::endl;
}
}
如果您需要更复杂的条件来搜索容器中的元素,您可以使用接受谓词作为参数的标准算法std::find_if
。
答案 2 :(得分:0)
std::find
如果找到它则返回数组中元素的迭代器,否则返回结束迭代器:
auto const last = std::end(choices);
auto const pos = std::find(std::begin(choices), end, "b");
if (last != pos) {
// Use pos here.
}
如果您不需要对元素执行任何操作,则可以使用any_of
:
if (std::any_of(std::begin(choices), std::end(choices),
[](std::string const& s) { return "b" == s; })
{
// "b" is in the array.
}
这两个函数都只是内部循环,它们不会比手写循环更快。如果您的数组已排序,那么您可以使用std::lower_bound
代替std::find
和std::binary_search
代替std::any_of
。
答案 3 :(得分:0)
除非以某种方式订购物品,否则没有更有效的方法。考虑到你想要找到的元素理论上可以在任何索引处,包括你要检查的最后一个索引。
如果您想有效地找到它,请使用std::set
。然后,您可以使用set::count(item) > 0
来确定item
是否在集合中。
此外,在python中,当您测试项目是否在列表item in [itemA, itemB, itemC]
或元组item in (itemA, itemB, itemC)
中时,它会有效地对所有元素进行循环。只有当您使用python的set
和frozenset
时,此搜索才会非常快。
如果您不想自己编写O(n)循环,并且想要更快查找,请使用std::find
类,我建议使用函数std::set
。