Используя один цикл for, как перебрать и проверить значения итератора? - PullRequest
0 голосов
/ 09 октября 2018

Здесь мне нужно использовать только один цикл for (и нет условия if внутри) для проверки значений итератора с помощью google test. Ниже приведен мой код

TEST(EVTValSortedVector, StdIterator)
{
    int arr[3], i;
    int data = 4;
    arr[0] = int(2);
    arr[1] = int(1);
    arr[2] = int(3);

    EVTValSortedVector<int> eTerriers;

    EXPECT_EQ(eTerriers.isEmpty(), true);

    for (i = 0; i < 3; i++)
    {
        eTerriers.insert(arr[i]);
    }
    EXPECT_EQ(eTerriers.isEmpty(), false);

    EVTValSortedVector<int>::iterator j = eTerriers.begin();
    EVTValSortedVector<int>::iterator k = eTerriers.begin();

    ++k;
    for (int i = 0; i < data - 1; i++, j++, ++k)
    {
        EXPECT_LE((*j), (*k));
        cout << "j and k value" << *j << *k << endl;
    }
}

Фактический вывод:

jk
1 2
2 3
3 2

Но мне нужен вывод, подобный этому:

jk
1 1
1 2
1 3
2 2
2 3
3 3

Если я получу этот необходимый вывод (выше), тотолько мои тесты будут пройдены.

Пожалуйста, помогите мне решить эту проблему, мое требование - использовать только один цикл for, а также отсутствие проверки условий внутри цикла (нет условия if).

Пожалуйста, помогите.

1 Ответ

0 голосов
/ 09 октября 2018

Вы не должны делать это за один 1 цикл.

for (auto i = eTerriers.begin(); i != eTerriers.end(); ++i)
{
    for (auto j = i; j != eTerriers.end(); ++j)
    {
        EXPECT_LE((*i), (*j));
        std::cout << "i and j value " << *i << *j << std::endl;
    }
}

1 : я включаю что-нибудь из <algorithm>по крайней мере, линейный в своих аргументах итератора как цикл для подсчета циклов

Если у вас менее строгий подсчет циклов, вы можете

#include <algorithm>

for (auto i = eTerriers.begin(); i != eTerriers.end(); ++i)
{
    std::for_each(i, eTerriers.end(), [i](auto & val)
    {
        EXPECT_LE((*i), (val));
        std::cout << "i and j value " << *i << val << std::endl;
    });
}

Есть один способ,но он включает в себя if в цикле и ужасен.

constexpr std::size_t data = 3;

for (std::size_t i = 0; i < (data * data); ++i)
{
    if ((i % data) <= (i / data))
    {
        EVTValSortedVector<int>::iterator j = eTerriers.begin() + (i % data);
        EVTValSortedVector<int>::iterator k = eTerriers.begin() + (i / data);
        EXPECT_LE((*j), (*k));
        cout << "j and k value" << *j << *k << endl;
    }
}

Переосмыслите ваши требования.

...