68

誰かが一定サイズのベクトルを定義する方法を知っていますか?

たとえば、定義する代わりに

std::vector<int>

そうなる

std::vector<10, int>

完全にクロスプラットフォームである必要があります。多分オープンソースクラス?

4

8 に答える 8

68

std :: vectorは常に動的に拡大できますが、初期サイズを割り当てる方法は2つあります。

これにより、初期サイズが割り当てられ、要素がゼロで埋められます。

std::vector<int> v(10);
v.size(); //returns 10

これにより、初期サイズが割り当てられますが、配列にゼロが入力されません。

std::vector<int> v;
v.reserve(10);
v.size(); //returns 0
于 2015-06-23T17:06:05.967 に答える
64

一定サイズのベクトルを定義する方法はありません。コンパイル時のサイズがわかっている場合は、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、他の回答で提案されているように。

于 2012-06-21T08:43:41.860 に答える
14

コンパイル時に指定されたサイズ(ala)を固定したいが、とstd::array<T, N>の間でさまざまな数の要素をベクトルに入力できるようにしたい場合は、が適切なオプションです。0Neastl::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であるのに対し、vectorfixed_vectorは0であることに注意してください。

于 2016-02-19T19:37:30.130 に答える
13

std :: array を使用する

読みやすくするために、typedefを作成できます。

typedef std::array<int, 10> MyIntArray;
于 2012-06-21T08:43:25.403 に答える
11

これは古い質問ですが、実行時にサイズが定義された一定サイズのインデックス付きコンテナが必要な場合は、 unique_ptrを使用します。

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

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


// Access
constantContainer[ i ]
于 2018-07-11T13:31:58.693 に答える
10

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;
于 2012-06-21T08:45:30.590 に答える
2

この---->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/を参照してください。

于 2012-06-21T08:49:16.070 に答える
0

ポリモーフィズムだけでなく最新の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;
    }
}
于 2021-07-30T06:01:27.877 に答える