使用指针(C ++)在数组中首次出现元素

时间:2017-11-26 03:17:55

标签: c++ pointers

int findFirst(const string a[], int n, string target)
 {
 for (int i = 0; i < n; i++)
 if (a[i] == target)
 return i;
return -1;
} 

如何在不使用方括号和使用以下函数头的情况下编写上述程序?

int findFirst(const string* a, int n, string target)

2 个答案:

答案 0 :(得分:1)

您可以简单地替换功能标题; const string a[]已经是指针参数,与const string* a完全相同。

然后,您可以取消引用a + i

for (int i = 0; i < n; i++)
    if (*(a + i) == target)

或增加a以及i

for (int i = 0; i < n; i++, a++)
    if (*a == target)

或者你只能使用指针

for (const string* p = a; p < a + n; p++)
    if (*p == target)

答案 1 :(得分:0)

首先,如果你编写一个有指针作为输入参数的函数,最好在nullptr(或0)上检查这个指针:

int findFirst(const string * a, int n, string target)
{
  if (a)
  {
    // do search
  }
  return -1;
}

其次,要搜索项目位置,您可以使用标准库中的算法:

#include <algorithm>

int findFirst(const std::string* a, int n, std::string target)
{
    if (a)
    {
        int res = std::distance(a, std::find(a, a + n, target));
        if (res < n)
        {
            return res;
        }
    }
    return -1;
}

第三,最好通过const引用传递目标以排除不必要的复制构造函数调用。因此,我们可以得到以下最终解决方案:

#include <algorithm>

int findFirst(const std::string* a, int n, const std::string& target)
{
    if (a)
    {
        int res = std::distance(a, std::find(a, a + n, target));
        if (res < n)
        {
            return res;
        }
    }
    return -1;
}