目前我正在编写一个邮政编码验证程序,并且我已经声明了6个整数变量并且根据邮政编码符合良好邮政编码标准的程度进行了适当命名。有6个整数允许我以这样的方式命名每个整数,以便他们计算的内容非常容易看到。但是,如果我使用整数数组来存储这些计数,那么我写的代码可能会更整洁,因为我发现我必须解释if语句来自regex_match我已经找到要递增的整数。
例如,我目前写道:
for(int iteration = 0 ; iteration < 6 ; iteration++) {
expression = testStrings[iteration];
if(std::regex_match(toTest, expression)) {
if(iteration == 0) return FullMatch; //place 0 match = Good UK Postcode
if(iteration == 1) return SyntaxFail; //place 1 match = Poor UK Postcode
if(iteration == 2) return ZipCodeFail; //place 2 match = Zipcode
if(iteration == 3) return IrelandFail; //place 3 match = Ireland
if(iteration == 4) return IrelandFail; //place 4 match = Alternate Ireland
if(iteration == 5) return CanadaFail; //place 5 match = Canada
}
}
但这可能是假设:
for(int iteration = 0 ; iteration < 6 ; iteration++) {
expression = testStrings[iteration];
if(std::regex_match(toTest, expression)) {
return PostcodeCount[iteration]
}
或类似的事情说明了我为爱尔兰地址检查了两种不同的方式。
我编写的代码中还有其他地方,这些地方目前是明确的,但可以使用数组来缩短以少量可读性为代价的代码量。
目前我的程序运行得很好,并且它完成了我想要它做的所有事情,但是我想使用这段代码一次验证大约30,000个邮政编码,所以我更喜欢它比它更有效它目前是(虽然这并不意味着目前需要大量的时间)。如果几乎没有效率增益,我不想牺牲太多的可读性。
我曾尝试谷歌寻求这个问题的答案,但我今晚的谷歌必须很弱,因为我只发现了关于向量和数组的相对效率的网络参考,没有什么是我想知道的。
答案 0 :(得分:3)
两种解决方案之间的差异可以忽略不计。无论如何,regex_match
电话的费用可能更高。 BTW您的代码调用switch
语句。
答案 1 :(得分:1)
if(std::regex_match(toTest, testStrings[0])) return FullMatch; //Good UK
if(std::regex_match(toTest, testStrings[1])) return SyntaxFail; //Poor UK
if(std::regex_match(toTest, testStrings[2])) return ZipCodeFail; //Zipcode
if(std::regex_match(toTest, testStrings[3])) return IrelandFail; //Ireland
if(std::regex_match(toTest, testStrings[4])) return IrelandFail; //Alt Ireland
if(std::regex_match(toTest, testStrings[5])) return CanadaFail; //Canada
我会更进一步,只使用命名变量而不是正则表达式的数组。
答案 2 :(得分:1)
无论您采用哪种方式,性能都无关紧要。但是为了方便地扩展测试次数,我将把循环重构为如下所示:
for (const auto& pc : postcodeTests)
{
if (std::regex_match(toTest, pc.expression))
{
return pc.postcode;
}
}
在这种情况下, postcodeTests
是包含至少包含两个成员的元素的任何集合:expression
和postcode
。