当前,我有一个程序可以从文件中读取和提取多条数据,并且我想确保这些值正确匹配期望值,我知道这在其他编程语言中应该如何工作例如带有列表和元组的python等,但是我不确定在C ++中使用单元测试的最佳方法,同时保持代码的最小化和高效性。我目前有多个数组,我希望验证它们是否符合期望的值,因此我可以使用不同的输入文件来测试程序。
为了描述这一点,从本质上讲,我希望验证例如
int arrayone [5] = { 11, 12, 13, 14, 15 };
等于 {11,12,13,14,15}
,如果值相等则成功完成单元测试,如果值不相等或顺序不同则失败。因此,我正在寻找解决这个问题的最佳方法。
答案 0 :(得分:5)
使用C ++ Sub aver()
With Worksheets("Sheet4") 'Change to your sheet
Dim lastrw As Long
lastrw = .Cells(.Rows.Count, 3).End(xlUp).Row
Dim num() As Variant
ReDim num(1 To lastrw) As Variant
Dim i As Long
For i = 4 To lastrw
Dim j As Long
j = Application.Match(1E+99, Rows(i), 1)
num(i) = .Cells(i, j).Value
Next i
.Range("O1").Value = Application.Average(num)
End With
End Sub
代替,您将从其公开的所有方法中受益,例如std::array
:
operator==
或者对于C ++ 11和C ++ 14:
#include <iostream>
#include <array>
int main() {
std::array arrayone{ 11, 12, 13, 14, 15 };
std::array facit{ 11, 12, 13, 14, 15 };
if(arrayone==facit) {
std::cout << "true\n";
} else {
std::cout << "false\n";
}
}
答案 1 :(得分:5)
std::mismatch()
将完成工作并提供比std::equal
更多的信息。如果将auto
更改为std::pair<int*, int*>
#include <algorithm>
int expectedResult[5] = {11, 12, 13, 14, 15};
int* arr1end = arrayone + 5;
//I assume here that expectedResult is the same length as arrayone (5).
auto res = std::mismatch(arrayone, arr1end, expectedResult);
if(res.first != arr1end) {
std::cout << "Arrays not matching at " << std::distance(arrayone, res.first) << ", expected: " << *res.second << ", got: " << *res.first;
}
更好的版本,前提是arrayone
是数组类型(例如,如果您将其作为函数参数传递,则可以decay to a pointer)。由于使用auto
和std::begin()
#include <algorithm>
#include <iterator>
int expectedResult[5] = {11, 12, 13, 14, 15};
auto res = std::mismatch(std::begin(arrayone), std:end(arrayone), std::begin(expectedResult));
if(res.first != std::end(arrayone)) {
std::cout << "Arrays not matching at " << std::distance(arrayone, res.first) << ", expected: " << *res.second << ", got: " << *res.first;
}
话虽如此,我建议您选择一个框架并使用它。这些库是专门为使单元测试变得容易和快速而构建的(即上面的序列是GoogleTest中的一个衬里,并且不容易出现不同的数组长度错误)。
我还建议您不要使用纯C样式的数组。如Ted Lyngmo所述,如果您使用标准容器,则可以使用更多选项(例如内置opearator ==
),它们还会为您管理资源。
答案 2 :(得分:1)
如果坚持不使用STL和使用原语,那么这几乎是一个C问题,因为它没有使用C ++功能。如果可以放心地假设它们的大小为 n ,则应该可以进行以下操作。
给出两个大小为n的原始整数数组,一般实现为
bool equal(int *arr1, int *arr2, int n) {
for (int i = 0; i < n; i++) {
if arr1[i] != arr2[i] return false;
}
return true
}
尽管总的来说,std :: array比旧的C样式数组更好,但是我对这个问题的理解还不清楚,如果可以使用STL,那么其他解决方案就更好了。
编辑:如果不清楚上述解决方案存在哪些问题,则为
如果您想要更好的解决方案,请使用memcmp,如注释中建议的那样(据我所知,这并没有使用库):
对于类型为 X 且大小为 n 的两个数组,您可以简单地说
bool eql = !(memcmp(arr1, arr2, n*sizeof(X))