使用一个 for 循环如何迭代和测试迭代器值?
Using one for loop how to iterate and test the iterator values?
这里我只需要使用一个 for 循环(内部没有 if 条件)来使用 google 测试来测试迭代器值,下面是我的代码
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;
}
}
Actual output:
j k
1 2
2 3
3 2
But i need output like this:
j k
1 1
1 2
1 3
2 2
2 3
3 3
如果我得到所需的输出(以上),那么只有我的测试用例会通过。
请帮我解决这个问题,我的要求是只使用一个for循环,而且循环内没有条件检查(没有if条件)。
请帮忙。
你不应该在一个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;
}
}
重新考虑您的要求。
这里我只需要使用一个 for 循环(内部没有 if 条件)来使用 google 测试来测试迭代器值,下面是我的代码
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;
}
}
Actual output:
j k
1 2
2 3
3 2But i need output like this:
j k
1 1
1 2
1 3
2 2
2 3
3 3
如果我得到所需的输出(以上),那么只有我的测试用例会通过。
请帮我解决这个问题,我的要求是只使用一个for循环,而且循环内没有条件检查(没有if条件)。
请帮忙。
你不应该在一个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;
}
}
重新考虑您的要求。