誰かが一定サイズのベクトルを定義する方法を知っていますか?
たとえば、定義する代わりに
std::vector<int>
そうなる
std::vector<10, int>
完全にクロスプラットフォームである必要があります。多分オープンソースクラス?
std :: vectorは常に動的に拡大できますが、初期サイズを割り当てる方法は2つあります。
これにより、初期サイズが割り当てられ、要素がゼロで埋められます。
std::vector<int> v(10);
v.size(); //returns 10
これにより、初期サイズが割り当てられますが、配列にゼロが入力されません。
std::vector<int> v;
v.reserve(10);
v.size(); //returns 0
一定サイズのベクトルを定義する方法はありません。コンパイル時のサイズがわかっている場合は、C++11のstd::arrayaggregateを使用できます。
#include <array>
std::array<int, 10> a;
関連するC++11サポートがない場合は、TR1バージョンを使用できます。
#include <tr1/array>
std::tr1::array<int, 10> a;
またはboost::array、他の回答で提案されているように。
コンパイル時に指定されたサイズ(ala)を固定したいが、とstd::array<T, N>
の間でさまざまな数の要素をベクトルに入力できるようにしたい場合は、が適切なオプションです。0
N
eastl::fixed_vector
std :: vector:
aのサイズstd::vector
は動的です。必要なストレージを動的に割り当てます。サイズを制限してエラーを強制することはできません。
ただしreserve
、特定のサイズを指定してから、新しいストレージを割り当てる必要がある前に、そのサイズまで要素を追加することができます。
vector.size()
最初は0で、要素を追加すると増加します
std :: array:
aのサイズはstd::array
コンパイル時定数です。必要なストレージを静的に割り当てます。サイズを変更することはできません。
array.size()
は常に配列のサイズであり、次のようになります。array.max_size()
eastl :: fixed_vector:
のサイズは、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;
簡単な例:
#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;
}
出力:
size=0 capacity=10
size=10 capacity=10
size=0 capacity=10
のサイズarray
は10であるのに対し、vector
とfixed_vector
は0であることに注意してください。
これは古い質問ですが、実行時にサイズが定義された一定サイズのインデックス付きコンテナが必要な場合は、 unique_ptrを使用します。
// c++14
auto constantContainer = std::make_unique<YourType []> ( size );
// c++11
std::unique_ptr<YourType[]> constantContainer {new YourType[ size ]};
// Access
constantContainer[ i ]
Astd::vector
は動的コンテナであり、その成長を制限するメカニズムはありません。初期サイズを割り当てるには:
std::vector<int> v(10);
C ++ 11には、std::array
より適切ながあります。
std::array<int, 10> my_array;
コンパイラがC++11をサポートしていない場合は、以下の使用を検討してboost::array
ください。
boost::array<int, 10> my_array;
この---->std::vector<10, int>
は無効であり、エラーが発生します。しかし、新しいC++標準は新しいクラスを導入しました。std::array。次のように配列を宣言できます。
std::array<int, 5> arr; // declares a new array that holds 5 ints
std::array<int, 5> arr2(arr); // arr2 is equal to arr
std::array<int, 5> arr3 = {1, 2, 3, 4, 5}; // arr3 holds 1, 2, 3, 4, 5
はstd::array
一定のサイズで、をサポートしますiterator/const_iterator/reverse_iterator/const_reverse_iterator
。このクラスの詳細については、http://cplusplus.com/reference/stl/array/を参照してください。
ポリモーフィズムだけでなく最新のC++機能が必要な場合は、次のことができます。
template <typename T, unsigned N>
struct polymorphic_std_array : std::array<T, N>, std::span<T>
{
polymorphic_std_array(std::array<T,N> a)
: std::array<T, N>(a)
, std::span<T>(*static_cast<std::array<T, N>*>(this))
{}
};
int main()
{
std::span<int>* p = new polymorphic_std_array<int, 2>({ 1,2 });
for (const auto& e : *p)
{
std::cout << e << std::endl;
}
}