2012-07-14 27 views
4

我有兩個問題與C++中標準庫的向量類有關。如何檢查C++ stl向量中存在的值並將函數應用於向量的每個元素?

  1. 我該如何檢查一個值(比方說一個整數)是否已經存在於一個向量中?

    我想要的單詞如下:「如果整數已存在於向量中,則下一個,否則將其添加到向量的末尾。」

  2. 我該如何應用一個函數來保存向量中的每個元素的參數? (看來我不能做到這一點與的for_each)

    中的話: 「在向量每個Z元素的運用MyAddFn(I,J)」

...也許我不在stl向量序列容器的正確軌道上,我應該定義自己的迭代器?

+1

你在(2)中究竟是什麼意思? 'MyAddFn(i,j)'應該應用於什麼? – jalf 2012-07-14 13:44:45

+0

您能否詳細說明2? – Mahesh 2012-07-14 13:45:49

+0

您是否可以在編譯器中使用C++ 11功能?如果你是這樣的話,我建議你使用for_each和(lambda)(http://en.wikipedia.org/wiki/Anonymous_function#C.2B.2B)或std :: bind。否則,你可以處理[bind1st和bind2nd](http://www.sgi.com/tech/stl/binder1st.html),但你真的應該看看[boost :: foreach](http:// www .boost.org/DOC /庫/ 1_50_0/DOC/HTML/foreach.html)。 – Olwaro 2012-07-14 14:09:03

回答

9

1)

std::find(v.begin(), v.end(), 5) == v.end() // checks that vector<int> v has no value 5.

2)使用新的C++ 11的std ::綁定例如,但實際的建議,我需要使用MyAddFn的更多方面。

+0

使用vector :: end()檢查不等式檢查值是否不存儲在向量中!即當向量中存在值5時,表達式的計算結果爲true。 – Ruud 2012-07-14 13:48:11

+0

@RuudvA em,現在是正確的,這是一個錯字 – ForEveR 2012-07-14 13:49:20

1

對於1,使用std::find算法。如果元素不存在,它會將迭代器返回到最後。在這種情況下,添加元素。

1

第二個問題。你可以用對象代替函數:

#include <vector> 
#include <algorithm> 

class apply_me 
{ 
    int multiplicator_; 
    public: 
    apply_me(const int multiplicator) : multiplicator_(multiplicator) 
    {}; 
    int operator()(const int element) const 
    { 
    return element*multiplicator_; 
    }; 
}; 
int main() 
{ 
    std::vector<int> v; 
    std::transform(v.begin(), v.end(),v.begin(), apply_me(3)); 
} 
相關問題