恒定大小的矢量

Iro*_*gle 42 c++ stl vector

有人知道定义常量矢量的方法吗?

例如,而不是定义

std::vector<int>
Run Code Online (Sandbox Code Playgroud)

这将是

std::vector<10, int>
Run Code Online (Sandbox Code Playgroud)

它应该是完全交叉平台的.也许是一个开源类?

jua*_*nza 48

无法定义常量大小的矢量.如果您在编译时知道大小,则可以使用C++ 11的std :: array聚合.

#include <array>

std::array<int, 10> a;
Run Code Online (Sandbox Code Playgroud)

如果您没有相关的C++ 11支持,可以使用TR1版本:

#include <tr1/array>

std::tr1::array<int, 10> a;
Run Code Online (Sandbox Code Playgroud)

或者boost :: array,正如其他答案中所建议的那样.

  • 虽然要注意`array`与`vector`的不同之处在于数据包含在对象中.对于10个整数,您可能永远不会注意到差异,但对于大型数组,您可能(例如)注意到它们没有"O(1)``swap`,而大型数据则可以. (5认同)
  • 还要注意,数组没有像vector一样的`size` vs`capacity'的概念.在数组`size` ==`max_size`中.也就是说,你不能创建一个大小为10的数组(即:10个可能元素的空间),但只填充5并期望`size`返回5. (5认同)

sve*_*ten 41

std :: vector总是可以动态增长,但是有两种方法可以分配初始大小:

这将分配初始大小并用零填充元素:

std::vector<int> v(10);
v.size(); //returns 10
Run Code Online (Sandbox Code Playgroud)

这会分配初始大小,但不会使用零填充数组:

std::vector<int> v;
v.reserve(10);
v.size(); //returns 0
Run Code Online (Sandbox Code Playgroud)

  • 我来这里就是为了寻找这个答案。这个问题看起来很像有人在寻找“std::array”,但我在编译时不知道我的大小,并且确实只想分配一定数量的固定元素。 (2认同)

And*_*rew 12

使用std :: array

为了更好的可读性,您可以制作typedef:

typedef std::array<int, 10> MyIntArray;
Run Code Online (Sandbox Code Playgroud)

  • 当然,既然我们正在编写C++ 11,我们就会编写`使用MyIntArray = std :: array <int,10>;`. (13认同)
  • 这是假设大小在编译时已知。 (4认同)

Ste*_*mer 11

如果你想要一个固定的编译时指定大小(ala std::array<T, N>),但是你希望能够在0和之间填充不同数量的元素N,那么一个好的选择就是eastl::fixed_vector.

的std ::向量:

a的大小std::vector是动态的 - 它将动态分配所需的存储,并且您不能限制大小并强制执行错误.

但是reserve,您可以使用一定的大小,然后在需要分配新存储之前添加该大小的元素.

vector.size() 最初为0,并在添加elementss时增加

的std ::数组:

a的大小std::array是编译时常量 - 它将静态分配所需的存储,并且您无法更改大小.

array.size() 始终是数组的大小,并且等于 array.max_size()

EASTL :: fixed_vector:

a的大小eastl::fixed_vector可以是静态的也可以是动态的.

它最初将分配一定数量的元素,然后如果允许动态增长,将根据需要动态分配.

出于您最初要求的目的,您可以禁用增长(通过bEnableOverflow下面的模板实例化)

fixed_vector.size() 最初为0,并在添加元素时增加.

template<typename T, 
         size_t nodeCount, 
         bool bEnableOverflow = true, 
         typename OverflowAllocator = 
                      typename eastl::type_select<bEnableOverflow,
                                                  EASTLAllocatorType, 
                                                  EASTLDummyAllocatorType>::type>
class fixed_vector;
Run Code Online (Sandbox Code Playgroud)

简单的例子:

#include <iostream>
#include <vector>
#include <array>
#include "EASTL/fixed_vector.h"

int main()
{
    std::vector<int> v;
    v.reserve(10);
    std::cout << "size=" << v.size() << " capacity=" << v.capacity() << '\n';

    std::array<int, 10> a;
    std::cout << "size=" << a.size() << " capacity=" << a.max_size() << '\n';

    eastl::fixed_vector<int, 10, false> fv;
    std::cout << "size=" << fv.size() << " capacity=" << fv.capacity() << '\n';

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

size=0 capacity=10
size=10 capacity=10
size=0 capacity=10
Run Code Online (Sandbox Code Playgroud)

请注意,大小array为10,vector而且fixed_vector为0


hmj*_*mjd 9

A std::vector是一个动态容器,没有限制其增长的机制.要分配初始大小:

std::vector<int> v(10);
Run Code Online (Sandbox Code Playgroud)

C++ 11有一个std::array更合适的:

std::array<int, 10> my_array;
Run Code Online (Sandbox Code Playgroud)

如果您的编译器不支持C++ 11,请考虑使用boost::array:

boost::array<int, 10> my_array;
Run Code Online (Sandbox Code Playgroud)


Par*_*ari 5

这是一个古老的问题,但是如果有人只需要在运行时定义大小的恒定大小的索引容器,我就喜欢使用unique_ptr

// c++14
auto constantContainer = std::make_unique<YourType []> ( size );

// c++11
std::unique_ptr<YourType[]> constantContainer {new YourType[ size ]};


// Access
constantContainer[ i ]
Run Code Online (Sandbox Code Playgroud)