c++ - 如何在cpp中以有效的方式比较 vector 和数组?

标签 c++ arrays vector foreach lambda

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

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 以更好的方式编写它。你有什么想法?谢谢。

最佳答案

使用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;
                      });
}

请注意,此代码和您的代码都假定 vector 和数组具有相同的大小。更好的实现是额外传入 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);
}

关于c++ - 如何在cpp中以有效的方式比较 vector 和数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30241074/

相关文章:

c - 当 argv*[] 是一个字符串时,如何通过 c 中的命令行传递数组?

c - C 中的 vector 实现

c++ - 数组、对象、类来组织具有多项选择和真/假问题的测试问卷程序

c++ - 如何将 std::vector<float> 转换为 float 数组?

C++套接字流api

c++ - 如何使用vc++代码获取系统唯一ID?

c++ - 在 C++ 中增加数组大小

javascript - 压缩两个数组Javascript

c++ - QSqlite 的变化

c++ - 生成随机 uint64_t