通过向量进行迭代以实现搜索功能

时间:2018-09-06 04:42:46

标签: c++

我有一个vector<int>,我需要搜索给定值val,然后返回该值首次出现的索引i。如果向量为空,则应返回常数EMPTY_VEC,这是我到目前为止的内容。

const int EMPTY_VEC = std::numeric_limits<int>::max();
size_t find(const std::vector<int>& v, int val)
{
    for(int i = 0; i < v.size(); ++i) {
        if(v[i] == val) { 
            return i;
            break;

        } else if(v.size() == 0) {
            return EMPTY_VEC;
        }
    }}

当我调用此函数时,每次都会返回0。

它与矢量的定义方式有关吗?

uint32_t seed = std::chrono::system_clock::now().time_since_epoch().count();
    // uint32_t is a type that is guaranteed to be 32 bits wide (unlike int or unsigned int)
    // seed is the pseudorandom value returned from the system clock object (like time(0))

    std::minstd_rand gen(seed);
    // gen is the object responsible for creating the random numbers

    std::uniform_int_distribution<int> dist(0,BIGGEST_RANDOM);
    // choose random ints between 0 and BIGGEST_INT

    // OK, stop ignoring now
    std::vector<int> data {};
    for (size_t i = 0; i < DATA_SIZE; ++i)
    {
        data.push_back(dist(gen)); // dist(gen) is the random int
    }`

 std::cout << find(data, 8) << std::endl;

2 个答案:

答案 0 :(得分:1)

注意编译器警告,您在函数末尾缺少返回值。请注意,您的if(v.size() == 0)条件在循环内 ,并且在任何情况下都不是很有用。您的功能应该是这样的:

const int EMPTY_VEC = std::numeric_limits<int>::max();
size_t find(const std::vector<int>& v, int val)
{
    for (size_t i = 0; i < v.size(); ++i) {
        if (v[i] == val) { 
            return i;
        }
    }
    return EMPTY_VEC;
}

但是,最好改用std::find

auto it = std::find(v.begin(), v.end(), val);
if (it != v.end()) {
    // do something if value is found
}

答案 1 :(得分:1)

您的函数有一个导致未定义行为的错误,而两个结构则缺乏清晰性。

size_t find(const std::vector<int>& v, int val)
{
   for(int i = 0; i < v.size(); ++i) {
      if(v[i] == val) { 
         return i;

         // Lack of clarity.
         // The function will never hit this line.
         // The return statement above will ensure that.
         break;
      }

      // Lack of clarity.
      // This else block will never be executed.
      // You will enter the for loop only when v is not empty.
      // Hence, the conditional will always evaluate to false.
      else if(v.size() == 0) {
         return EMPTY_VEC;
      }
   }

   // Error.
   // Missing return statement. This causes undefined behavior.
}

如果您注意到函数每次都返回0,那么我可以想到的两件事可以解释其行为。

  1. 8是v中的第一项。
  2. v中找不到
  3. 8。即使没有return语句,当函数到达函数末尾时,它也会返回0。请注意,这只是未定义行为的标志。不要依赖那个值。

我认为将返回类型更改为int会更好。如果找到该项目,则可以返回有效索引;如果找不到该项目,则可以返回-1。输入向量为空时返回std::numeric_limits<int>::max()听起来不正确。

int find(const std::vector<int>& v, int val)
{
    for (size_t i = 0; i < v.size(); ++i) {
        if (v[i] == val) { 
            return i;
        }
    }

    // Item not found. Return -1.
    return -1;
}

有了这一更改,就无需将空向量与非空向量区别对待。