在向量中遍历结构成员时出错

Error Iterating Through Members of a Struct in Vector

本文关键字:成员 出错 结构 遍历 向量      更新时间:2023-10-16

我的.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;
        }

虽然我很确定我的逻辑是错误的,但我目前得到的错误表达式error必须有一个指针类型。我被困了一段时间了,谢谢。

更改

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++)
  // ^^^^^

"虽然我很确定我的逻辑错了,…"

这是无法回答的,除非您提供更多关于逻辑需求的上下文。

连同问题πάῥεῖ指出,您的代码当前存在一个问题,即除了浪费一些时间之外,它根本无法完成任何任务。

考虑:

    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;
    }

delaylengthweight都是在进入块时创建的,在退出时销毁的——所以我们创建一对值,然后销毁它们,并对向量中的尽可能多的项目重复——但永远不要对我们计算的值做任何事情。它们只是经过计算,然后被销毁。

假设你解决了这个问题,我也会以足够不同的方式编写代码,这样这个问题一开始就不太可能发生。例如,假设您真的想修改数组中的每个项,而不是仅仅从中计算一些内容并丢弃结果。你可以用这样的代码做到这一点:

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

现在,代码实际上完成了一些事情,似乎我们不太可能意外地把它写错了。

一句话:标准算法是你的朋友。与人类朋友不同,他们喜欢被利用。