web-dev-qa-db-fra.com

Initialisation du vecteur statique

Je me demande s’il existe une façon plus «agréable» d’initialiser un vecteur statique qu’en dessous

class Foo
{
    static std::vector<int> MyVector;
    Foo()
    {
        if (MyVector.empty())
        {
            MyVector.Push_back(4);
            MyVector.Push_back(17);
            MyVector.Push_back(20);
        }
    }
}

C'est un exemple de code :)

Les valeurs dans Push_back () sont déclarées indépendamment. pas dans le tableau ou quelque chose.

Edit: si ce n'est pas possible, dites-le moi aussi :)

33
Xirdus

En général, j'ai une classe pour la construction de conteneurs que j'utilise (comme celle-ci à partir de boost), telle que vous puissiez faire:

const list<int> primes = list_of(2)(3)(5)(7)(11);

De cette façon, vous pouvez aussi créer le constante statique pour éviter les modifications accidentelles.

Pour une statique, vous pouvez définir ceci dans le fichier .cc:

// Foo.h

class Foo {
  static const vector<int> something;
}

// Foo.cc

const vector<int> Foo::something = list_of(3)(5);

En C++ Ox, nous aurons un mécanisme de langage pour le faire, en utilisant les listes d’initialisation, afin que vous puissiez simplement faire:

const vector<int> primes({2, 3, 5, 7, 11});

Voir ici .

27
Todd Gardner

En C++ 03, le moyen le plus simple était d'utiliser une fonction factory:

std::vector<int> MakeVector()
{
    std::vector v;
    v.Push_back(4);
    v.Push_back(17);
    v.Push_back(20);
    return v;
}

std::vector Foo::MyVector = MakeVector(); // can be const if you like

"Optimisation de la valeur renvoyée" devrait signifier que le tableau est rempli à la place et non copié, si cela pose problème. Alternativement, vous pouvez initialiser à partir d'un tableau:

int a[] = {4,17,20};
std::vector Foo::MyVector(a, a + (sizeof a / sizeof a[0]));

Si cela ne vous dérange pas d'utiliser une bibliothèque non standard, vous pouvez utiliser Boost.Assignment:

#include <boost/assign/list_of.hpp>

std::vector Foo::MyVector = boost::list_of(4,17,20);

En C++ 11 ou version ultérieure, vous pouvez utiliser l’initialisation par accolade:

std::vector Foo::MyVector = {4,17,20};
47
Mike Seymour

Avec C++ 11:

std::vector<int> Foo::MyVector = {4, 17, 20};
18
syvex

Vous pouvez essayer celui-ci:

int arr[] = { 1,2,3,4,5,6,7,8,9 };
MyVector.insert(MyVector.begin(), arr, &arr[sizeof(arr)/ sizeof(*arr)]);

Mais cela ne vaut probablement que si vous avez un très long vecteur, et ça n'a pas l'air beaucoup plus joli non plus. Cependant, vous vous débarrassez des appels répétés Push_back (). Bien sûr, si vos valeurs ne sont "pas dans un tableau", vous devez les entrer en premier, mais vous pourrez le faire de manière statique (ou au moins des références/pointeurs), en fonction du contexte.

2

Pourquoi ne pas initialiser avec un objet statique? Dans son composant, il pourrait appeler une fonction statique dans l'objet pour effectuer l'initalisation. 

1
bill

avec boost vous pouvez utiliser l'opérateur + = () défini dans l'espace de noms boost :: assign.

#include <boost/assign.hpp>

using namespace boost::assign;

int main()
{
    static std::vector<int> MyVector;
    MyVector += 4,17,20;
    return 0;
}

ou avec initialisation statique:

#include <boost/assign.hpp>

using namespace boost::assign;

static std::vector<int> myVector = list_of(4)(17)(2);

int main()
{
    return 0;
}

ou mieux encore, si votre compilateur prend en charge C++ 11, utilisez les listes d'initialisation.

0
J-Mik