我是编程新手,特别是C ++。我有一个任务,它的部分是使用结构编写一个函数。
struct S {
float m; //how many
int h; //where
float mx;
};
int main() {
S s;
s.m=0.5;
s.h=1;
vector<float> v(10);
for (int i=0;i<10;i++)
v[i]=sin(i);
S mx = max_search(v);
该功能正常,如果(mx.m>0.98935 && mx.m<0.9894 && mx.h==8
)。
我出来了这个功能代码,但我知道,它很有缺陷。
float max_search(vector<float> v) {
int max=0;
for (int i=0; i<v.size(); i++) {
if (v[i]>max) {
max=v[i];
}
return max;
}
}
我不知道,我应该怎么处理函数类型,也许返回值也是错误的。
答案 0 :(得分:0)
您希望return max;
处于最外层。现在它返回for循环的每次迭代,这意味着你只得到1次迭代。
float max_search(vector<float> v) {
float max=0.0f; <------------
for (int i=0; i<v.size(); i++) {
if (v[i]>max) {
max=v[i];
}
--------------
}
return max; <------------
}
我想你想把它称为s.mx = max_search(v);
您也可以使用std::max_element
s.mx = std::max_element(v.begin(),v.end()); // (begin(v),end(v)) in c++11
答案 1 :(得分:0)
如果您将某个功能声明为float
,为什么要返回int
?
float max_search(vector<float> v) {
float max = v[0]; //this way you avoid an iteration
for (int i = 1; i < v.size() - 1; i++)
if (v[i] > max) max = v[i];
return max;
}
您也可以使用迭代器来执行此操作:
float max_search(vector<float> v) {
float max = .0;
for (vector<float>::iterator it = v.begin(); it != v.end(); ++it)
if (*it > max) max = *it;
return max;
}
在第一个代码块中,将1减去v.size
非常重要,否则您将尝试访问不存在的元素。如果您的代码没有返回分段错误,那是因为std::vector
是安全的。这意味着std::vector
尝试来访问该元素,但无论如何,您正在进行最后一次不必要的迭代。这就是为什么使用迭代器会更好。
@KarthikT说的也是如此:你试图在每次迭代中返回max
,因此,在第一次迭代后,函数返回值并停止执行,总是检索第一个值矢量(如果该值大于0)。
我希望这有帮助。
答案 2 :(得分:0)
不确定我是否正确捕捉了您的主要问题。您想转换max_search函数的返回值float to struct S
吗?我将按照KarithikT的答案进行按摩并添加更多细节:
要启用implicit conversion
(从float到struct S),需要将转换函数添加到S
struct S {
S():m(0.0), h(0), mx(0.0){ } //
S(float x):m(0.0), h(0), mx(x){ } // to enalbe convert float to S
float m; //how many
int h; //where
float mx;
};
float max_search(const vector<float>& v) { // pass by const reference
float max=0.0f;
for (int i=0; i<v.size(); i++) {
if (v[i]>max) {
max=v[i];
}
}
return max;
}
您还可以使用std :: max_element从容器中查找max元素:
vector<float> v(10);
for (int i=0;i<10;i++) {
v[i]=sin(i);
}
S mx = *std::max_element(v.begin(), v.end());