将较小的向量与较大的向量进行比较,以检查它在较小向量的末尾是否不同
Compare smaller vector to bigger to check if it differs at the end of smaller
我们有两个大小的向量,取决于运行时,需要检查它们是否相等 - 只有在较小尺寸的向量结束后才不同元素。我使用了 std::equal,但问题是我需要首先找到哪个向量尺寸较小,这会导致额外的代码行:
#include <vector>
#include <iostream>
int main()
{
std::vector<int> a(1000, 3);
std::vector<int> a1(100, 3);
if(a.size() > a1.size())
{
if(std::equal(a1.begin(), a1.end(), a.begin()))
{
std::cout << "Same a gt a1" << std::endl;
}
}
if(a1.size() > a.size())
{
if(std::equal(a.begin(), a.end(), a1.begin()))
{
std::cout << "Same a1 gt a" << std::endl;
}
}
if(a1.size() == a.size())
{
if(std::equal(a.begin(), a.end(), a1.begin()))
{
std::cout << "Same a = a1" << std::endl;
}
}
}
是否可以改进比较两个向量或仅在较小向量末尾不同的代码?
从 C++14 开始,您可以使用 std::mismatch
并对照每个范围的末尾检查返回的一对迭代器:
auto it = std::mismatch(a.begin(), a.end(), a1.begin(), a1.end());
if (it.first == a.end() || it.second == a1.end()) {
// Equality
}
您还需要知道元素从哪里开始不同,如果没有,则在这一点上,较大的向量更大(您不想比较的子范围的开始)。
如果您事先计算较小的大小,则只需要一次调用std::equal
。我会像这样重构代码:
#include <vector>
#include <iostream>
#include <algorithm>
int main()
{
std::vector<int> a(1000, 3);
std::vector<int> a1(100, 3);
if (std::equal(a1.begin(), a1.begin() + std::min(a.size(), a1.size()), a.begin()))
{
std::cout << "Same" << std::endl;
}
return 0;
}
如果你需要保留关于哪个向量更大的第二个信息,你可以像这样实现它,例如:
std::cout << "Same " << ((a.size() == a1.size())? "a = a1" : ((a.size() > a1.size())? "a gt a1" : "a1 gt a")) << std::endl;
这是一个纯 C++11 解决方案,应该适用于任何顺序容器(例如 std::vector
、std::list
、std::deque
)。它使用自定义返回类型,因为您在原始代码段中显示的比较类型包含的信息比简单的布尔值可以包含的信息更多。
enum class CombinedCompareResult {
NotEqual, EqualAndFirstLarger, EqualAndSecondLarger, EqualIncludingSize
};
template <class Rng1, class Rng2>
CombinedCompareResult combinedCompare(const Rng1& rng1, const Rng2& rng2)
{
using std::begin;
const auto elementsToCompare = std::min(rng1.size(), rng2.size());
if (!std::equal(begin(rng1), std::next(begin(rng1), elementsToCompare), begin(rng2)))
return CombinedCompareResult::NotEqual;
else if (rng1.size() == rng2.size())
return CombinedCompareResult::EqualIncludingSize;
else if (rng1.size() > rng2.size())
return CombinedCompareResult::EqualAndFirstLarger;
else
return CombinedCompareResult::EqualAndSecondLarger;
}
这可以像下面一样使用,并且应该导致与问题中的代码相同的行为。
const auto cmp = combinedCompare(lst, a);
if (cmp == CombinedCompareResult::EqualIncludingSize)
std::cout << "Same a = a1" << std::endl;
else if (cmp == CombinedCompareResult::EqualAndFirstLarger)
std::cout << "Same a gt a1" << std::endl;
else if (cmp == CombinedCompareResult::EqualAndSecondLarger)
std::cout << "Same a1 gt a" << std::endl;
相关文章:
- 检查向量是否具有所有可能的字符组合
- 如何检查两个 std::向量在小于 O(n) 的时间复杂度内是否相等
- 如何检查类实例向量的索引是否为空
- C++模板功能检查唯一向量
- 检查两个向量是否并行的最有效方法
- 有没有办法搜索向量的元素,<String>然后检查它是否包含特定的字符,如果它确实打印了它
- 检查向量是否使用除法和阻抗算法进行排序
- C++如何获取索引I处的元素,并检查它在向量或数组中是否为空
- 在检查对的一个值后,lower_bound对向量
- 如果字符串向量包含字符'p',如何检查 c++
- 递归回文检查,不使用向量、大小或其他参数
- 如何在共享指针向量中检查重复的"ofstream"对象
- C++:检查向量中的元素是否大于另一个具有相同索引的元素的有效方法?
- 在 c++ 中检查 if 条件中的向量位置范围
- 如果元素的数量已经知道,检查数组或向量中的所有元素是否相等更好?
- 如何使用 gtest 构造检查存储在向量中的结构(字段)?
- Boost.Test - 如何在交叉点上检查两个向量
- C++ 如何检查另一个向量中是否存在矢量的内容
- 如果条件检查,多个向量大小相等
- 使用std::find根据字符串向量检查字符串时出现的问题