C ++检查项目是否在数组中

时间:2014-02-17 13:30:57

标签: c++ memory-efficient

在c ++中我有一个数组,我试图检查数组中是否有某个元素。这是我的阵列:

string choices[3] = {"a", "b", "c"}

我想要它,如果用户输入存在于数组中,它打印出true,所以如果用户输入“b”,那么它将打印为true并给我数组索引。这就像是in或者Python的Python版本。我知道我可以使用for循环遍历所有元素,但是有更有效的方法吗?感谢。

4 个答案:

答案 0 :(得分:2)

要查找索引,您可以使用以下代码:

int x = std::distance(choices, std::find(choices, choices + 3, "b"));

此处,distancefind方法可以在<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::findstd::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的setfrozenset时,此搜索才会非常快。

如果您不想自己编写O(n)循环,并且想要更快查找,请使用std::find类,我建议使用函数std::set