2015-06-03 37 views
7

vector<int> someVector一個例子,istringstream someStringStream你可以這樣做:如何使用提取操作符(>>)和矢量<bool>?

for (int i=0; i < someVector.size(); i++) { 
    someStringStream >> someVector[i]; 
} 

我知道vector<bool>是一種高效的實現,並operator[]返回參考對象。 對於這段代碼,我應該使用索引而不是迭代器,主要是爲了便於閱讀。 目前,我使用的是這樣的:

for (int i=0; i < someVector.size(); i++) { 
    bool temp; 
    someStringStream >> temp; 
    someVector[i] = temp; 
} 

是否有實現這種更直接的方式是什麼?

回答

0

如果你想要的是布爾和其他類型相同的接口,可以很容易地換東西。

template <typename T> 
T read(std::istream& stream) 
{ 
    T value; 
    stream >> value; // TODO: guard against failure of extraction, e.g. throw an exception. 
    return value; 
} 

但是,直接使用它需要您指定一個類型。

for (int i=0; i < someIntVector.size(); i++) 
{ 
    someIntVector[i] = read<int>(someStringStream); 
} 

for (int i=0; i < someBoolVector.size(); i++) 
{ 
    someBoolVector[i] = read<bool>(someStringStream); 
} 

如果重用了幾個不同的載體,只需再次把它包:

template <typename T, typename A> 
void fillVectorFromStream(std::istream& stream, std::vector<T, A>& vector) 
{ 
    for (int i = 0; i < vector.size(); ++i) 
    { 
     vector[i] = read<T>(stream); 
    } 
} 

因此,使用簡單地變成

fillVectorFromStream(streamOfBool, vectorOfBooleanValues); 
fillVectorFromStream(streamOfIntegers, vectorOfIntegers); 
+0

這不安全。如果operator >>失敗,那麼「value」將被初始化。要麼顯式檢查流狀態,要麼將std :: ios_base :: failbit或ORed到流的異常()。 –

+1

@ArneVogel在C++ 11中進行了更改:如果提取失敗,則將值寫入零(請參閱http://en.cppreference.com/w/cpp/io/basic_istream/operator_gtgt)。但是,我同意在生產代碼中進行錯誤檢查是必要的。儘管如此,還有很多方法可以做到這一點。選擇一個不是問題的範圍,恕我直言。 – stefan

5

你可以使用std::copystd::vector範圍的構造,如果要消耗整個流:

std::stringstream ss("1 0 1 0"); 
std::vector<bool> vec; 
std::copy(std::istream_iterator<bool>(ss), {}, std::back_inserter(vec)); 

LIVE DEMO

std::stringstream ss("1 0 1 0"); 
std::vector<bool> vec(std::istream_iterator<bool>(ss), {}); 

LIVE DEMO

現在看看你張貼的例子,如果你確定自己std::vector的規模是正確的,你可以使用std::generate如下面的例子:

std::stringstream ss("1 0 1 0"); 
std::vector<bool> vec(4); 
std::generate(std::begin(vec), std::end(vec), [&ss](){ bool val; ss >> val; return val;}); 

LIVE DEMO

相關問題