Vector initialisierung



  • Morgen,

    int var[3]={1,2,3};

    vector<int>var(3,1); //3 Elemente mit 1 initialiseren

    Kann man einen Vector auch so intialisieren wie ich es bei dem Array gemacht habe?
    Oder muss ich das bei einem Vector so machen:

    vector<int>var; 
    for(int i=i;i<4;i++)
    {
    var.push_back(i); 
    
    }
    


  • DerInitialisierer schrieb:

    Kann man einen Vector auch so intialisieren wie ich es bei dem Array gemacht habe?

    Klares jein. Genauer: Mit C++11 ja, mit C++03 nicht. C++11 kennt sogenannte initializer-lists, für die es auch eine Konstruktorüberladung des std::vector gibt.

    Oder muss ich das bei einem Vector so machen:

    vector<int>var; 
    for(int i=i;i<4;i++)
    {
    var.push_back(i); 
    
    }
    

    Klares nein. std::vector bietet einen Konstruktor für eine iterator-Range an, so dass auch in C++03 nicht mit push_back alles einzeln gemacht werden muss.

    http://en.cppreference.com/w/cpp/container/vector/vector (Nummer 4 und 7)



  • Ehm und wie funktioniert das dann damit? Mit Templates habe ich bisher noch nichts gemacht. (Templates kenne ich bisher nur vom Namen).

    template <class InputIterator>
    
    vector( InputIterator first, InputIterator last, 
             const Allocator& alloc = Allocator() );         (4)
    
    vector( std::initializer_list<T> init, 
             const Allocator& alloc = Allocator() );	 (7) 	(since C++11)
    

    Bei Beispiel 7 da kann man ja auf initializer klicken und bekommt ein Code Beispiel, aber da gibt mein Compiler diese Fehler aus: 😞

    main.cpp|3|initializer_list: No such file or directory|
    main.cpp|8|error: expected `)' before '<' token|
    main.cpp||In function `int main()':|
    main.cpp|15|error: too many initializers for `S<int>'|
    main.cpp|15|error: conversion from `int' to non-scalar type `std::vector<int, std::allocator<int> >' requested|
    main.cpp|17|error: expected primary-expression before "auto"|
    main.cpp|17|error: expected `;' before "auto"|
    main.cpp|20|error: expected `)' before ';' token|
    main.cpp|15|warning: unused variable 's'|
    


  • Das feature ist neu in C++11. d.h. es wird erst irgendwann von allen Compilern unterstützt.

    Laut http://wiki.apache.org/stdcxx/C++0xCompilerSupport funktioniert das aktuell nur im GNU Compiler >= 4.4 (mit Schalter -std=c++0x oder so).



  • C++03:

    int arr[] = {1, 2, 3};
    std::vector<int> vec(arr, arr + sizeof(arr) / sizeof(int));
    

    C++11::

    std::vector<int> vec = {1, 2, 3};
    


  • DerInitialisierer schrieb:

    Ehm und wie funktioniert das dann damit?
    Mit Templates habe ich bisher noch nichts gemacht. (Templates kenne ich bisher nur vom Namen).

    Dann wirds Zeit. Lies dir einen Einstieg in Templates und etwas zum Konzept der Iteratoren durch, dann wirds was mit der Nr 4. Nr 7 scheint bei dir ja nicht zu laufen, d.h. dein Compiler unterstützt noch keine initializer-lists.



  • Ethon schrieb:

    C++03:

    int arr[] = {1, 2, 3};
    std::vector<int> vec(arr, arr + sizeof(arr) / sizeof(int));
    

    Beim Array würde ich noch static const verwenden.


Anmelden zum Antworten