ratman2050
ratman2050

Reputation: 123

Error Iterating Through Members of a Struct in Vector

I have a struct and two vectors in my .h file:

struct FTerm {
    int m_delay;
    double m_weight;
};

std::vector<FTerm> m_xterms;
std::vector<FTerm> m_yterms;

I've already read in a file to populate values to m_xterms and m_yterms and I'm trying to iterate through those values:

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

Although I'm pretty sure I have the logic wrong, I currently get the error Error expression must have a pointer type. Been stuck at this for a while, thanks.

Upvotes: 0

Views: 62

Answers (2)

Jerry Coffin
Jerry Coffin

Reputation: 490108

Along with the problem πάντα ῥεῖ pointed out, your code currently has a problem that it simply doesn't accomplish anything except wasting some time.

Consider:

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

Both delaylength and weight are created upon entry to the block, and destroyed on exit--so we create a pair of values, then destroy them, and repeat for as many items as there are in the vector--but never do anything with the values we compute. They're just computed, then destroyed.

Assuming you fix that, I'd also write the code enough differently that this problem simply isn't likely to happen to start with. For example, let's assume you really wanted to modify each item in your array, instead of just computing something from it and throwing away the result. You could do that with code like this:

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

Now the code actually accomplishes something, and it seems a lot less likely that we'd end up accidentally writing it incorrectly.

Bottom line: standard algorithms are your friends. Unlike human friends, they love to be used.

Upvotes: 1

πάντα ῥεῖ
πάντα ῥεῖ

Reputation: 1

Change

int delaylength = m_xterms->m_delay * 2;
double weight = m_xterms->m_weight;

to

int delaylength = terms->m_delay * 2;
               // ^^^^^
double weight = terms->m_weight;
             // ^^^^^

as you want to access values through

vector<FTerm>::iterator terms;

within the loop

for (terms = m_xterms.begin(); terms < m_xterms.end(); terms++)
  // ^^^^^

"Although I'm pretty sure I have the logic wrong, ..."

That can't be answered, unless you give more context about the requirements for the logic.

Upvotes: 1

Related Questions