2015-02-11 10 views
5

byłem przyzwyczajony do korzystania Python lub Matlab, gdzie mogłem stworzyć listę takich jak:Jak szybko tworzyć tablice w C++

min = 5; 
step = 2; 
max = 16; 
Range = min:step:max; 

i Range byłaby lista [5,7,9,11, 13,15].

Czy istnieje równoważny prosty sposób generowania listy w rodzaju "Zakres" w C++? Do tej pory najprostszą rzeczą, jaką mogę wymyślić jest użycie pętli for, ale jest to dość nudne.

+0

więc umieścić go w funkcji. –

+0

Cóż, pętla for jest całkiem dobrym pomysłem, jeśli mnie zapytasz (nigdy by mi się nie przyszło do głowy). –

+0

[Zrozumienie listy w C++] (http://dev-perspective.blogspot.com/2012/10/on-list-comprehension-in-c.html) – philipxy

Odpowiedz

2

Będziesz musiał wdrożyć że siebie, coś takiego:

std::vector<int> createArray(int min, int max, int step) 
{ 
    std::vector<int> array; 
    for(int i = min; i < max; i += step) 
    { 
     array.push_back(i); 
    } 
    return array; 
} 
5

C++ nie dostarcza takiego, albo w języku lub w bibliotece standardowej. Chciałbym napisać szablon funkcji szukać (w przybliżeniu) jak coś z biblioteki standardowej, coś w tej kolejności:

namespace stdx { 
    template <class FwdIt, class T> 
    void iota_n(FwdIt b, size_t count, T val = T(), T step = T(1)) { 
     for (; count; --count, ++b, val += step) 
      *b = val; 
    } 
} 

Stamtąd będzie to wyglądać mniej więcej tak:

std::vector<int> numbers; 
stdx::iota_n(std::back_inserter(numbers), 6, 5, 2); 
1

Nie ma taka predefiniowana metoda w C++ do tego celu. Poniższy kod może ci pomóc.

std::vector<int> createArrayRange(int min, int max, int step) 
{ 
    std::vector<int> array; 
    for(int i = min; i < max; i += step) 
    { 
     array.push_back(i); 
    } 
    return array 
} 

Lub To byłoby stosunkowo szybsze.

void createArrayRange(std::vector<int>& array, int min, int max, int step) 
{ 
    for(int i = min; i < max; i += step) 
    { 
     array.push_back(i); 
    } 
} 

int main() 
{ 
    std::vector<int> array; 
    createArrayRange(array, min, max, step); 

    return 0; 
} 
1

Możesz użyć do tego celu std::generate.

std::vector<int> createArray(int min, int max, int step) 
{ 
    std::vector<int> array((max-min)/step); 
    int n = min; 
    std::generate(array.begin(), array.end(), 
    [&]() 
    { 
     int res = n; 
     n+=step; 
     return res; 
    }); 
    return array; 
} 
0

Brak wyraźnych pętle potrzebne:

vector<int> data(6,2); 
data[0] = 5; 
std::partial_sum(data.begin(),data.end(),data.begin());