我正在尝试检查数组中是否存在尽可能少的行中的字符串示例:
string foo[] = {blah,blahhh,blahhhh}
string bar = "blah";
if (bar in foo){
cout << "true";
}else {
cout << "false";
}
答案 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语句中的代码)
这是(据我所知......最简单的方法)
希望这会有所帮助