【问题标题】:Initialise size of std::array in a constructor of the class that uses it在使用它的类的构造函数中初始化 std::array 的大小
【发布时间】:2012-10-27 19:03:58
【问题描述】:

是否可以将std::array<class T, std::size_t N> 用作类的私有属性但在类的构造函数中初始化其大小

class Router{
    std::array<Port,???> ports; //I dont know how much ports do will this have
public:
    Switch(int numberOfPortsOnRouter){
        ports=std::array<Port,numberOfPortsOnRouter> ports; //now I know it has "numberOfPortsOnRouter" ports, but howto tell the "ports" variable?
    }
}

我可以使用指针,但是没有它可以做到吗?

【问题讨论】:

    标签: c++ arrays templates c++11 std


    【解决方案1】:

    你必须让你的类Router成为一个模板类

    template<std::size_t N> 
    class Router{
        std::array<Port,N> ports; 
    
    ...
    }
    

    如果您希望能够在Router 级别 指定ports 的大小。顺便说一句,N 必须是编译时已知的常量。

    否则你需要std::vector

    【讨论】:

    • 是的,但是在将路由器传递给函数时,我必须知道数字 N。例如“void foo(Router??> r);”无论如何,我会使用向量。
    • 方便typedef你将使用的Router&lt;&gt;类,即typedef Router&lt;20&gt; MyRouter;
    【解决方案2】:

    不,大小必须在编译时知道。请改用std::vector

    class Router{
        std::vector<Port> ports;
    public:
        Switch(int numberOfPortsOnRouter) : ports(numberOfPortsOnRouter) {
        }
    };
    

    【讨论】:

    • 但是向量适用于具有“变化”长度的数据类型。另一方面,“端口”的大小是恒定的,永远不会改变。我想知道使用矢量是否会降低一些性能。
    • @user:当一种方法有效而另一种方法无效时,您怎么能“失去性能”?此外,您可以选择不调整 std::vector 的大小,除了创建 Router 对象时的分配之外,没有“开销”。
    • @user1459339:不,vector 用于动态大小的数组 == 在编译时未知。
    • 没有性能损失,其次,您将其与甚至不起作用的方法进行比较。
    • 所以理论上的魔法数组实现可能会更高效。向量需要指针间接。理论上,数组可以存储在类的更大实例中,附加在末尾或其他东西上。在 C 中这样做是非常标准的。不确定在 C++ 中的简单方法。
    【解决方案3】:

    std::array&lt;T, N&gt; 的大小是编译时常量,不能在运行时更改。如果您想要一个具有灵活边界的数组,您可以使用std::vector&lt;T&gt;。如果你的数组的大小没有改变,并且你从它的上下文中知道了大小,你可以考虑使用std::unique_ptr&lt;T[]&gt;。它更轻量,但也无助于复制或调整大小。

    【讨论】:

    • "a bit more light-weight" == 省了一个字 :) 编辑:如果你必须分开存储尺寸,实际上什么也省不了。
    • @ybungalobill:你不必存储容量,所以它确实节省了一个词。
    • @BenjaminLindley:是的,但您可能会两次结束存储大小。一次为您自己,一次来自operator new[] 实现。
    • @ybungalobill:额外的开销也适用于向量,所以 unique_ptr 仍然少 1。
    • @ybungalobill:通常你可以从上下文中推断出大小,例如,当你周围有另一个数组时。它还节省了容量。 std::vector&lt;T&gt; 存储三个 word ,它们有机会被填充到四个单词。也就是说,您可以节省控制记录大小的 66% 到 75%。此外,在移动对象时,您只需触摸一个单词而不是三个。
    【解决方案4】:

    std::array 是一个固定长度的数组。因此,长度必须在编译时知道。如果你需要一个动态长度的数组,你想改用std::vector

    class Router{
        std::vector<Port> ports;
    public:
        Switch(int numberOfPortsOnRouter):ports(numberOfPortsOnRouter){}
    };
    

    【讨论】:

      猜你喜欢
      • 2016-02-16
      • 2015-09-04
      • 2022-01-22
      • 2014-02-27
      • 1970-01-01
      • 2018-07-21
      • 1970-01-01
      • 2020-05-05
      • 2016-12-29
      相关资源
      最近更新 更多