我想编写一个程序来执行以下任务:
我有一个整数数组,
我,作为用户,给出一个整数 s (如word search ),
我希望它进行线性搜索并在数组中找到 s ,
可能有多个单元格包含所需的 s ,
代码应该从单元格0开始,搜索,在 n_th 单元格中找到 s ,
在输出中显示 n ,
然后离开循环并转到程序的另一部分到标签
然后返回循环搜索 n + 1_th 单元格中的单元格到最后。
我用 goto label 做了这个,但还有其他方法吗?
答案 0 :(得分:0)
是。可以办到。但首先,我想向您展示简单而优雅的解决方案:
std::vector<int> v = {....};
int to_search = ...;
for (auto elem : v)
{
if (e == to_search)
{
// do something
}
}
你确定这不是你真正需要的吗?
现在达到你的实际要求:
template <class It, class T>
It find_next(It begin, It end, T to_search)
{
for (auto it = begin; it != end; ++it)
{
if (*it == to_search)
return it;
}
return end;
}
std::vector<int> v = {....};
int to_search = ...;
auto it = v.begin();
while ((it = find_next(it, v.end(), to_search)) != v.end())
{
// do something with *it
}
您真的想要使用可以轻松调整的索引:
int find_next(const std::vector<int>& v, int begin, int end, int to_search)
{
for (int i = begin; i != end; ++i)
{
if (v[i] == to_search)
return i;
}
return end;
}
std::vector<int> v = {....};
int to_search = ...;
int from = 0;
while ((from = find_next(v, from, v.size(), to_search)) != v.size())
{
// do something with v[from]
}
现在如果你真的想要原始循环而不是函数,那当然也可以这样做:
std::vector<int> v = {....};
int to_search = ...;
int from = 0;
while (true)
{
for (; from < v.size(); ++from)
{
if (v[from] == to_search)
break;
}
if (from == v.size())
break;
// do something with v[from]
}
我希望你能看到我呈现给你的每一次迭代变得更加复杂,基本上做同样的事情。
所以我真的会重新考虑我向你展示的第一个是不是你想要的。
免责声明:未编译,未经过测试
答案 1 :(得分:0)
两种方法的例子,假设它是你感兴趣的索引。
找到元素时调用函数:
void search(const std::vector<int>& v, int x, std::function<void(int)> index_handler)
{
for (int i = 0; i < v.size(); ++i)
{
if (v[i] == x)
{
index_handler(i);
}
}
}
让来电者确定起点(如std::string::find
):
int search_2(const std::vector<int>& v, int x, int start)
{
for (int i = start; i < v.size(); ++i)
{
if (v[i] == x)
{
return i;
}
}
return -1;
}
使用示例:
int main()
{
// Method 1
std::vector<int> vs = { 1, 2, 1, 2, 1, 2, 3};
search(vs, 2, [](int i) { std::cout << "found at index " << i << '\n'; });
// Method 2
int index = search_2(vs, 2, 0);
while (index >= 0)
{
std::cout << "found at index " << index << '\n';
index = search_2(vs, 2, index + 1);
}
}
第二种方法更灵活,但也更麻烦,更容易出错。