2012-07-14 75 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)); 
} 
相关问题