2013-07-05 39 views
1

我是新來的C++。我有一個大小爲n的向量。我想在矢量廣告商店中搜索新矢量的正值和負值。我不知道正面和負面值的數量。存儲正數和負向不同的向量

任何人都可以幫助我嗎?

+3

這裏的基本解決方案很簡單,如果你知道語言,那麼你可以試着更具體地說明你正在努力的部分和/或迄今爲止嘗試過的部分嗎? –

+1

你能告訴我們你已經做了什麼 – Alexis

+0

你爲什麼覺得這需要一個基於矢量的解決方案? – Craig

回答

2

假設v成爲您std::vector<int>載體和0是積極的,你只需要循環載體和存儲在一個向量正數和負數的其他:

using std::vector; 
vector<int> pos, neg; 

for (vector<int>::const_iterator it = v.cbegin(); it != v.cend(); it++) { 
    if ((*it) >= 0) pos.push_back((*it)); 
    else neg.push_back((*it)); 
} 

一個std::vector<int>::const_iterator在這裏,因爲使用你不需要修改任何意義上的原始矢量,你只需要閱讀它的值。

+0

非常感謝,這正是我一直在尋找的。 :) –

+2

@ H'H告訴我,這個問題/解決方案有什麼難的?說真的,我對什麼是不明顯的感興趣。檢查數字是正面還是負面?或者是什麼? (也許是迭代器,但是然後你恢復到大小和下標,或者可怕的話,你閱讀文檔...) – 2013-07-05 11:51:02

+0

@ H2CO3,因爲我說我是新的C++,我不知道這個迭代器和push_back .. ..不是你的專家,我問一些明顯的問題.... –

3

如果你可以重新排列你的源向量項目,它可能是最容易做的是這樣的:

auto part = std::partition(input.begin(), input.end(), [](int p) { return p < 0; }); 

std::vector<int> neg(input.begin(), part); 
std::vector<int> pos(part, input.end()); 
+0

不錯,雖然OP可能會驚訝於在正整數容器中發現'0':) – juanchopanza

+0

非常整潔的解決方案,確實如此。 – 2013-07-05 11:52:32

+0

@juanchopanza:他可能。由於他沒有說出如何處理零,我猜他實際上是指負數和非負數(儘管我可能應該明確說明)。 –

10

下面是使用std::partition_copy標準庫中的另一個解決方案:

std::vector<int> src, neg, pos; 

std::partition_copy(
    src.begin(), src.end(), 
    back_inserter(neg), 
    back_inserter(pos), 
    [](int value){ return value < 0; } 
); 
+0

這會變得更好。 – 2013-07-05 11:53:15

+1

我不禁要+1。不是因爲我認爲這是一個很好的解決方案,而是因爲我剛剛發現'partition_copy':D –

+0

肯定是+1 *,因爲它是一個很好的解決方案。雖然我應該添加一個註釋,該函數是在C++ 11中引入的(但是答案中使用的lambda也是如此)。 –

1

一@ Shos的答案變化,涉及較少的指針,可能更易於閱讀:

using std::vector; 
vector<int> pos, neg; 

for (auto& el : v) 
{ 
    if (el >= 0) 
     pos.push_back(el); 
    else 
     neg.push_back(el); 
}