如何在cpp中有效地比较向量与数组?

Dek*_*rer 2 c++ arrays foreach lambda vector

我想以更好(更快)的方式编写代码.我有一个容器向量和一个简单的数组.我想比较矢量的内容和数组的内容.假设我有这样的类:

struct A
{
    float aa;
    struct(float p_aa) : aa(p_aa) {}
};

struct B : public A
{
    A bb;
    struct(float p_aa) : A(p_aa) {}
};
Run Code Online (Sandbox Code Playgroud)

我还有一个容器和一个简单的数组:

std::vector<B> l_v = {B(1), B(3)};
B l_b[2] = {B(1), B(3)};
Run Code Online (Sandbox Code Playgroud)

将容器与数组进行比较的函数是:

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;
}
Run Code Online (Sandbox Code Playgroud)

我想用lambda或foreach更好地编写它.你有什么想法?谢谢.

Bar*_*rry 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;
                      });
}
Run Code Online (Sandbox Code Playgroud)

请注意,这个和您的代码都预先假定向量和数组具有相同的大小.更好的实现是额外传递长度,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);
}
Run Code Online (Sandbox Code Playgroud)

或者作为一个数组:

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);
}
Run Code Online (Sandbox Code Playgroud)