#include <iostream>
#include <string>
using namespace std;
bool in_array(string value, string *array)
{
int size = (*array).size();
for (int i = 0; i < size; i++)
{
if (value == array[i])
{
return true;
}
}
return false;
}
int main() {
string tab[2] = {"sdasd", "sdsdasd"};
string n;
cin >> n;
if (in_array(n, tab)) {
}
return 0;
}
如果 n 字符串位于标签数组中,我想检查C ++,但代码会返回错误。 我做错了什么?也许我应该使用矢量?
答案 0 :(得分:25)
int size = (*array).size();
它不会告诉你array
的大小,它会告诉你该数组中第一个字符串的长度,你应该将数组的长度分别传递给函数。该函数应如下所示:
bool in_array(string value, string *array, int length)
但更好的选择是使用std::vector
和std::find
:
bool in_array(const std::string &value, const std::vector<string> &array)
{
return std::find(array.begin(), array.end(), value) != array.end();
}
然后,您可以像:
一样使用它int main() {
std::vector<std::string> tab {"sdasd", "sdsdasd"};
if (in_array(n, tab)) {
...
}
}
答案 1 :(得分:5)
当一个数组作为参数传递给只接受指针的函数时,你不能查询函数中数组的大小(因为它被转换为“愚蠢”指针到了第一个元素,仅此而已。您通常会在签名或“结束”迭代器中添加“count”参数。
您尝试实施的内容基本上是std::find
。它需要两个迭代器(序列的开始和结束)和要找到的元素。只需使用此功能。
std::find(std::begin(tab), std::end(tab), n);
如果找到了元素,将返回一个迭代器,否则返回结束迭代器。检查与end迭代器的相等性将告诉您是否在数组中找到了元素。
如果你不喜欢std算法的“迭代器接口”,你可以通过使用模板函数包裹std::find
来实现类似PHP的签名:
template<class Element, class Container>
bool in_array(const Element & element, const Container & container)
{
return std::find(std::begin(container), std::end(container), element)
!= std::end(container);
}
请注意:这个答案假设是C ++ 11。如果使用较旧的编译器,它可能不起作用,或者仅在将-std=c++11
添加到编译器标志时才有效。