我有一个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;
答案 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,那么我可以想到的两件事可以解释其行为。
v
中的第一项。v
中找不到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;
}
有了这一更改,就无需将空向量与非空向量区别对待。