Mechatrnk
Mechatrnk

Reputation: 111

Iterate over vectors with n and n*n elements

I have this Google test assertions

ASSERT_FLOAT_EQ(longerVector[0], shorterVector[0]);
ASSERT_FLOAT_EQ(longerVector[1], shorterVector[1]);
ASSERT_FLOAT_EQ(longerVector[2], shorterVector[2]);
ASSERT_FLOAT_EQ(longerVector[3], shorterVector[0]);
ASSERT_FLOAT_EQ(longerVector[4], shorterVector[1]);
ASSERT_FLOAT_EQ(longerVector[5], shorterVector[2]);
ASSERT_FLOAT_EQ(longerVector[6], shorterVector[0]);
ASSERT_FLOAT_EQ(longerVector[7], shorterVector[1]);
ASSERT_FLOAT_EQ(longerVector[8], shorterVector[2]);

as you can see, there are two vectors, shorter with n elements and longer with n*n elements (in this case 3 and 9 respectively).

How could I create two nested for loops, which would make my code shorter and simpler?

I tried for example this but it failed. I understand why but I was not able to come up with anything better.

for(size_t i = 0; i < shorterVector.size(); i++)
{
    for(size_t j = 0; j < shorterVector.size(); j++)
    {
        ASSERT_FLOAT_EQ(longerVector(i*j), shorterVector(j);
    }
}

Thank you very much for any help and I apologize for maybe a dumb question.

Upvotes: 0

Views: 63

Answers (2)

mch
mch

Reputation: 9814

for(size_t i = 0; i < shorterVector.size(); i++)
{
    for(size_t j = 0; j < shorterVector.size(); j++)
    {
        ASSERT_FLOAT_EQ(longerVector[i*shorterVector.size() + j], shorterVector[j]);
    }
}

You should assert before that shorterVector.size() * shorterVector.size() == longerVector.size().

If you do not want to have the multiplication in the inner loop body you can do:

for(size_t i = 0, k = 0; i < shorterVector.size(); i++)
{
    for(size_t j = 0; j < shorterVector.size(); j++)
    {
        ASSERT_FLOAT_EQ(longerVector[k++], shorterVector[j]);
    }
}

Upvotes: 2

Evadore
Evadore

Reputation: 107

Use this instead

for(size_t i = 0; i < longerVector.size(); i++)
{
        ASSERT_FLOAT_EQ(longerVector[i], shorterVector[i%3]);  
}

Upvotes: 2

Related Questions