2012-01-13 124 views
9

我想用一種特殊的方法初始化一個std::vector<unsigned int>,在我用作參考的C++書籍(德語書籍「Der C++程序員'Ulrich Breymann,如果有問題的話)。該書是關於STL序列類型的一節,具體涉及到list,vectordeque。在本節中,他寫道,有這樣的序列類型中的兩種特殊的構造,即,如果X指的是這樣一種類型,用連續無符號整數列表初始化std :: vector <unsigned int>

X(n, t) // creates a sequence with n copies of t 
X(i, j) // creates a sequence from the elements of the interval [i, j) 

我想使用的unsigned int間隔第二一個,那就是

std::vector<unsigned int> l(1U, 10U); 

得到初始化列表{1,2,...,9}。然而,我得到的是一個帶有值爲10的unsigned int的矢量: - |第二個變體是否存在,如果是,我該如何強制它被調用?

回答

10

重讀附近有段落描述了每個參數都是。具體而言,應該提及ij不是值,而是迭代器。此構造函數非常常用於製作其他類型容器的副本。如果你想得到一系列的值,Boost library提供了一個counting iterator,這正是你想要的。

std::vector<unsigned int> numbers(
    boost::counting_iterator<unsigned int>(0U), 
    boost::counting_iterator<unsigned int>(10U)); 
+0

謝謝,按需要工作!這本書對於那個特定的構造函數有點不確定,但後來對字母i,j實際上明確用於迭代器。釷。 – Thomas 2012-01-13 18:44:37

0

不,該變體不存在。第二個構造函數從兩個指向另一個序列的迭代器初始化一個向量。

這裏是在行動「兩個迭代器」構造的一個例子:

int fill_data[4] = { 1, 2, 3, 4 }; 
std::vector<int> v(fill_data, fill_data + 4); 
+0

感謝您的編輯請求,我錯誤地將其標記爲不正確。 :)我已經修復它。 – 2012-01-13 18:39:09

2

一個非增強的方式來做一個自增的迭代器。

#include <vector> 
#include <iostream> 
#include <algorithm> 

static int NUM_ITEMS = 10; 

class gen_range { 
    public: 
     gen_range(int i) { idx = i; } 
     int operator()() { return (idx++); }; 

    int idx; 
}; 

int main() { 

    std::vector<int> x(NUM_ITEMS); 
    std::generate_n(x.begin(), NUM_ITEMS, gen_range(0)); 

    for (int i=0; i < x.size(); i++) { 
     std::cout << x[i] << std::endl; 
    } 
} 
1

C++ 11:

std::vector<int> idxs (n); 

std::generate_n (idxs.begin(), n, [] { static int i {1}; return i++; }); 
19

至少有三種方式,你可以做到這一點。一個是由Brian

前面提到
//method 1 
generate(v.begin(), v.end(), [] { static int i {1}; return i++; });  

,如果你使用的是C++ 11

//method 2 
iota(v.begin(), v.end(), 1); 

或者相反,你可以初始化用ls你的容器也可以使用std ::絲毫然後做的部分總之。我不認爲有人會使用第三種方法:)

//method 3 
vector<int> v(n, 1);              
partial_sum(v.begin(), v.end(), v.begin()); 
+0

如果要生成包含累計和的數組,方法3非常方便。添加另一個'partial_sum(v.begin(),v.end(),v.begin())',並且對於n = 5,您得到{1,3,6,10,15}。 – lifebalance 2016-01-05 04:07:32

+0

請注意,這裏的「生成」使用靜態。把它放在一個函數中,多次調用它,它會繼續計數。使用'ValueType i = {1}; std :: generate(first,last,[&i] {return i ++;});'改爲。 – 2017-06-27 17:22:32

相關問題