C ++更优雅的方法在多维数组中设置默认值

时间:2015-07-27 18:01:39

标签: c++ arrays constructor initialization default

在我的.h文件中,我有:

struct tup{
    tup() : 
    token{{-1,"a","b","c","d","e","f"},
          {-1,"a","b","c","d","e","f"},
          ...
          {-1,"a","b","c","d","e","f"}} {}
    struct {
        int pos;
        std::string nj, ny, pa, ri, ct, fl;
    } token[100];

其中“...”指的是97行相同类型的代码。是否有更优雅的方式为我的令牌设置默认值?

3 个答案:

答案 0 :(得分:5)

如果您愿意使用std::vector而不是数组,那么您可以使用:

struct tup{
    tup() : tokens(100, {-1,"a","b","c","d","e","f"}) {}
    struct token {
        int pos;
        std::string nj, ny, pa, ri, ct, fl;
    };
    std::vector<token> tokens;
};

答案 1 :(得分:0)

这是一个演示程序,它显示了如何在编译器支持C ++ 2014的情况下定义构造函数。否则,您必须将类型std::remove_extent_t更改为C ++ 2011中的等效类型。

#include <iostream>
#include <algorithm>
#include <iterator>
#include <type_traits>
#include <string>

struct tup{
    tup() 
    { 
        std::fill( std::begin( token ), std::end( token ),  
                   std::remove_extent_t<decltype( token )>( {-1,"a","b","c","d","e","f"} ) );
    }

    struct {
        int pos;
        std::string nj, ny, pa, ri, ct, fl;
    } token[100];
};

int main()
{
    tup tup;

    std::cout << tup.token[0].pos << ' ' << tup.token[0].nj << std::endl;
    std::cout << "//..." << std::endl;
    std::cout << tup.token[99].pos << ' ' << tup.token[99].nj << std::endl;

}    

节目输出

-1 a
//...
-1 a

在任何情况下,您都可以使用我所展示的标准算法std::fill或其他方式,例如使用lambda表达式。

答案 2 :(得分:0)

您应该在cpp文件中使用构造函数(以及类而不是结构)。数组的实际内容是一个不应该在标题中的实现细节。 最好的方法是在初始化类的方法中使用循环(100个项目对于计算机来说是一个很小的数字,你不会看到差异)。它还允许您更好地处理错误(构造函数不能轻易返回错误代码;您可以使用引用或成员,但它很难看)。这是我能想到的最佳方法。

在你的解析器中,所有的字符串都只是字符吗?如果n是你的字符串的最大大小,你可以简单地使用char或char [n + 1]。使用std :: strings,您可以为小尺寸(浪费一点空间)进行静态分配,为较大尺寸进行动态分配。如果必须处理分配错误,那么初始化类的成员就是您所需要的。因此,标题只提供其他文件所需的最少信息(结构和大小,而不是数据)。

如果您希望以后能够阅读代码,我还建议您使用有意义的变量名称(它们的大小不是问题)。

100的限制看起来像代码闻起来对我来说。为什么不使用动态分配和不受限制的大小?您可以在构建它们时简单地在集合中推送新的标记值。默认值应仅在令牌的构造函数中,而不是在具有虚拟大小的数组中。如果以后扩展解析器以处理更多令牌怎么办?如果您希望代码发展,那么阵列的硬编码最大值是一种不好的做法。当你达到极限时,你经常会在发现错误之前遇到错误。