遍历 Vector 中结构的成员时出错
Error Iterating Through Members of a Struct in Vector
我的 .h 文件中有一个结构和两个向量:
struct FTerm {
int m_delay;
double m_weight;
};
std::vector<FTerm> m_xterms;
std::vector<FTerm> m_yterms;
我已经读入一个文件来填充 m_xterms 和 m_yterms 的值,我正在尝试遍历这些值:
vector<FTerm>::iterator terms;
for (terms = m_xterms.begin(); terms < m_xterms.end(); terms++)
{
int delaylength = m_xterms->m_delay * 2; // Assume stereo
double weight = m_xterms->m_weight;
}
虽然我很确定我的逻辑有误,但我目前收到错误错误表达式必须具有指针类型。一直卡在这上面,谢谢。
改变
int delaylength = m_xterms->m_delay * 2;
double weight = m_xterms->m_weight;
到
int delaylength = terms->m_delay * 2;
// ^^^^^
double weight = terms->m_weight;
// ^^^^^
因为你想通过
访问值
vector<FTerm>::iterator terms;
循环内
for (terms = m_xterms.begin(); terms < m_xterms.end(); terms++)
// ^^^^^
"Although I'm pretty sure I have the logic wrong, ..."
无法回答这个问题,除非您提供更多关于逻辑要求的上下文。
随着 πìντα ῥεῖ 指出的问题,您的代码 目前 有一个问题,它除了浪费一些时间外什么也做不了。
考虑:
for (terms = m_xterms.begin(); terms < m_xterms.end(); terms++)
{
int delaylength = m_xterms->m_delay * 2; // Assume stereo
double weight = m_xterms->m_weight;
}
delaylength
和 weight
都是在进入块时创建,并在退出时销毁——所以我们创建一对值,然后销毁它们,并重复尽可能多的项目向量中有——但永远不要对我们计算的值做任何事情。它们只是被计算出来,然后被销毁。
假设你解决了这个问题,我也会编写足够不同的代码,这个问题不太可能一开始就发生。例如,假设您真的想修改数组中的每一项,而不是仅仅从中计算一些东西然后丢弃结果。你可以用这样的代码来做到这一点:
std::transform(m_xterms.begin(), m_xterms.end(), // Source
m_xterms.begin(), // destination
[](FTerm const &t) { return {t.m_delay * 2, t.m_weight}; });// computation
现在代码确实完成了一些事情,和我们最终不小心写错的可能性似乎大大降低了。
底线:标准算法是你的朋友。不像人类朋友,他们喜欢被利用。
我的 .h 文件中有一个结构和两个向量:
struct FTerm {
int m_delay;
double m_weight;
};
std::vector<FTerm> m_xterms;
std::vector<FTerm> m_yterms;
我已经读入一个文件来填充 m_xterms 和 m_yterms 的值,我正在尝试遍历这些值:
vector<FTerm>::iterator terms;
for (terms = m_xterms.begin(); terms < m_xterms.end(); terms++)
{
int delaylength = m_xterms->m_delay * 2; // Assume stereo
double weight = m_xterms->m_weight;
}
虽然我很确定我的逻辑有误,但我目前收到错误错误表达式必须具有指针类型。一直卡在这上面,谢谢。
改变
int delaylength = m_xterms->m_delay * 2;
double weight = m_xterms->m_weight;
到
int delaylength = terms->m_delay * 2;
// ^^^^^
double weight = terms->m_weight;
// ^^^^^
因为你想通过
访问值vector<FTerm>::iterator terms;
循环内
for (terms = m_xterms.begin(); terms < m_xterms.end(); terms++)
// ^^^^^
"Although I'm pretty sure I have the logic wrong, ..."
无法回答这个问题,除非您提供更多关于逻辑要求的上下文。
随着 πìντα ῥεῖ 指出的问题,您的代码 目前 有一个问题,它除了浪费一些时间外什么也做不了。
考虑:
for (terms = m_xterms.begin(); terms < m_xterms.end(); terms++)
{
int delaylength = m_xterms->m_delay * 2; // Assume stereo
double weight = m_xterms->m_weight;
}
delaylength
和 weight
都是在进入块时创建,并在退出时销毁——所以我们创建一对值,然后销毁它们,并重复尽可能多的项目向量中有——但永远不要对我们计算的值做任何事情。它们只是被计算出来,然后被销毁。
假设你解决了这个问题,我也会编写足够不同的代码,这个问题不太可能一开始就发生。例如,假设您真的想修改数组中的每一项,而不是仅仅从中计算一些东西然后丢弃结果。你可以用这样的代码来做到这一点:
std::transform(m_xterms.begin(), m_xterms.end(), // Source
m_xterms.begin(), // destination
[](FTerm const &t) { return {t.m_delay * 2, t.m_weight}; });// computation
现在代码确实完成了一些事情,和我们最终不小心写错的可能性似乎大大降低了。
底线:标准算法是你的朋友。不像人类朋友,他们喜欢被利用。