什么是Javascript的“in”的c ++等价物?

时间:2011-10-26 00:20:10

标签: c++

我正在尝试检查数组中是否存在尽可能少的行中的字符串示例:

string foo[] = {blah,blahhh,blahhhh}
string bar = "blah";

if (bar in foo){
cout << "true";
}else {
cout << "false";
}

7 个答案:

答案 0 :(得分:2)

在C ++中没有这个关键字也没有这个构造。 你必须做一个循环或使用find函数。

http://www.cplusplus.com/reference/algorithm/find/

对于试图做同样事情的其他人(因为过去很多人问过我的问题):char数组和字符串文字(即const char数组)无法与相等或内置比较-in运算符:比较两个char文字与比较两个指针相同。 但是,您可以使用std :: string类型或使用旧的C样式函数,如strcmp。

如果你真的想避免编写太多代码行,只需用更多行编写另一个函数并用一行调用它。然后,您可以将它放在一个漂亮的头文件中,并在需要时包含它:)

#include <iostream>
#include <string>

using namespace std;

template<typename T, size_t N>
inline bool arraycontains(const T (&array)[N], const T& value)
{
    for (size_t i = 0; i < N; ++i)
        if (array[i] == value)
            return true;
    return false;
}

int main()
{
    string foo[] = { "blah", "blahhh", "blahhhh" };
    string bar = "blah";

    cout << (arraycontains(foo, bar) ? "true" : "false");
    return 0;
}

如果你不是一个数组有一个指针你应该使用一个函数,你可以将大小作为参数传递。

现在,如果你的数组很大,我认为你不想在数组中使用O(n)线性搜索,在这种情况下我知道你更喜欢使用std :: map或std: :hash_map(请注意,所有版本的STL都不提供hash_map。)

std :: map在内部使用红黑树(或AVL树,具体取决于实现),因此查找操作最糟糕的情况是O(log n),比O(n)快。

std :: hash_map反而在内部使用哈希表,给出了最差的案例复杂度O(n),但平均复杂度为O(1),在现实世界的应用程序中非常快。

答案 1 :(得分:2)

没有内置操作员。 C ++比Javascript更低级,所以你必须自己构建这些东西。

幸运的是,标准库提供了用于完成工作的算法。

使用C++11 ranges获取C风格数组的开头和结尾:

std::string foo[] = {"lol", "stack", "overflow"};
std::string bar   = "stack";

if (std::find(std::begin(foo), std::end(foo), bar) != std::end(foo))
   found();
else
   not_found();

如果没有这些范围,请手动提供数组的开头和结尾:

std::string foo[] = {"lol", "stack", "overflow"};
std::string bar   = "stack";

if (std::find(foo, foo+3, bar) != foo+3)
   found();
else
   not_found();

或者,更好的是,使用vector (我在这里使用了C ++ 11初始化)

std::vector<std::string> foo{"lol", "stack", "overflow"};
std::string bar = "stack";

if (std::find(foo.begin(), foo.end(), bar) != foo.end())
   found();
else
   not_found();

^我相信这也适用于std::array / boost::array,这与你的C风格数组的例子更直接相似。

答案 2 :(得分:0)

没有操作员。你必须使用一个函数来寻找它。要么自己编写(通过C风格数组的成员),要么使用STL容器和algorithms

答案 3 :(得分:0)

使用for循环,找到字符串后使用break语句。

答案 4 :(得分:0)

您应该使用std::find,这对于标准容器来说更简单,但对于普通数组的工作原理更少:

string *end = foo + sizeof foo/sizeof *foo;
if (std::find( foo, end, bar ) != end) {
   std::cout << "found";
} else {
   std::cout << "not found";
}

如果您使用的是正确的容器std::vector,则可以使用:

if ( std::find( foo.begin(), foo.end(), bar ) != foo.end() )

这从数组问题中消除了一些魔力。

答案 5 :(得分:0)

C ++缺乏像这样的运营商;你必须做类似的事情:

bool containsBar = false;
for(int i = 0; i < 3; i++) {
    if(foo[i] == bar) { // need to use strcmp or something here, just put == for simplicity.
        cout << "true";
        containsBar = true;
        break;
    }
}
if(!containsBar)
    cout << "false";

答案 6 :(得分:0)

在C和C ++中,确实没有特定的关键字(?)到“in”

可能最简单的方法是制作一个像这样的循环

bool isInsideArray = false; //by default isInsideArray is false
for (int counter = 0;counter>(sizeof(foo)/sizeof(foo[0]));counter++) //find the amount of elements in the array by finding the size of the whole array divided by the size of one element
{
  if (foo[counter] == bar) // check if bar is equal to the current foo element
  {
    isInsideArray = true; //set isInsideArray to true
    break; // break from the loop so we don't do any unnessecary procceessing
  }
}
if(isInsideArray) // if bar was encountered inside foo
{
  //code to be done if bar is inside foo
}
else // isInsideArray equals false
{
  //otherwise
}

这循环遍历数组的每个元素,并检查它是否等于bar,如果是这样,将标志设置为true并退出

如果标志设置为true,请执行 this(指if语句中的代码)

否则这样做(参考else语句中的代码)

这是(据我所知......最简单的方法)

希望这会有所帮助