我想以更好(更快)的方式编写代码。 我有一个容器向量和一个简单的数组。 我想比较矢量的内容和数组的内容。 假设我有这样的课程:
struct A
{
float aa;
struct(float p_aa) : aa(p_aa) {}
};
struct B : public A
{
A bb;
struct(float p_aa) : A(p_aa) {}
};
我还有一个容器和一个简单的数组:
std::vector<B> l_v = {B(1), B(3)};
B l_b[2] = {B(1), B(3)};
将容器与数组进行比较的函数是:
bool isTheSame(const std::vector<B> &l_v, B *l_b)
{
unsigned int count = 0;
for(auto it = l_v.begin(); it!= l_v.end(); ++it)
{
if(l_b[count].aa != it->aa)
{
return false;
}
++count;
}
return true;
}
我想用lambda或foreach更好地编写它。你有什么想法?感谢。
答案 0 :(得分:7)
使用std::equal
:
bool isTheSame(const std::vector<B> &l_v, B *l_b)
{
return std::equal(l_v.begin(), l_v.end(), l_b,
[](const B& lhs, const B& rhs){
return lhs.aa == rhs.aa;
});
}
请注意,这个和您的代码都预先假定向量和数组具有相同的大小。更好的实现方式是额外传递l_b
的长度,以便确保您不会从l_b
读取未初始化的内存:
bool isTheSame(const std::vector<B> &l_v, B *l_b, size_t len)
{
return len == l_v.size() &&
std::equal(l_v.begin(), l_v.end(), l_b, same_pred);
}
或作为数组:
template <size_t N>
bool isTheSame(const std::vector<B> &l_v, const B (&l_b)[N])
{
return N == l_v.size() &&
std::equal(l_v.begin(), l_v.end(), l_b, same_pred);
}