2014-01-02 2 views
1

Я хотел бы применить функцию к некоторым элементам std :: vector.I использовать std :: includes, чтобы проверить, существует ли «меньший» вектор в «большом» , и если существует, я хотел бы применить функцию к этим элементам «большего» вектора, которые равны элементам «меньше». Какие-либо предложения?C++ Применить функцию к некоторым элементам в контейнере

Edit:
Следующая была неправильно размещена в ответ на OP

Существует проблема с станд :: поиск! Он находит первое вхождение последовательности, содержащейся в векторе, а в моем векторе эти элементы находятся в нескольких положениях. Также у меня есть вектор объектов !!!

+0

Я не уверен, какая разница имеет * вектор объектов *. Если определить 'operator ==' для вашего * объекта *, то код, который я опубликовал ниже, должен работать. Стандартная библиотека также имеет ['find_end'] (http://en.cppreference.com/w/cpp/algorithm/find_end), которая найдет последнее вхождение поддиапазона. Чтобы найти произвольное событие, вы можете повторно вызвать 'std :: search' после изменения первого аргумента функции, основанной на результате предыдущего вызова. Если вы можете использовать Boost, он предлагает ['find_nth'] (http://www.boost.org/doc/html/boost/algorithm/find_nth.html), который делает то, что вы хотите. – Praetorian

ответ

2

Не уверен, в какой части у вас возникли проблемы, но вот простой пример, показывающий диапазон элементов, содержащихся в больших vector, которые идентичны содержимому меньшего, умноженного на 2. Я использовал std::search вместо std::includes, чтобы определить, содержит ли более крупный vector диапазон элементов меньшего размера, поскольку в отличие от includes, который возвращает логический результат, search вернет итератор в начало содержащегося диапазона в более крупном vector.

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

void times_two(int& t) 
{ 
    t *= 2; 
} 

int main() 
{ 
    std::vector<int> v1{1,2,3,4,5,6,7,8,9}; 
    std::vector<int> v2{4,5,6}; 

    // find if the larger vector contains the smaller one 
    auto first = std::search(v1.begin(), v1.end(), v2.begin(), v2.end()); 
    if(first != v1.end()) { 
     // get the last element in the sub-range 
     auto last = std::next(first, v2.size()); 

     // apply function to each sub-range element 
     std::for_each(first, last, times_two); 
    } 

    for(auto const& v : v1) { 
     std::cout << v << ' '; 
    } 
    std::cout << '\n'; 
} 

Выход:

1 2 3 8 10 12 7 8 9 

Edit:
Here's an example, который использует boost::find_nth для выполнения поиска.

+0

nit, вместо определения вашего собственного функтора times_two, не забудьте о шаблоне-шаблоне умножения std, чтобы сделать это для вас: std :: transform (сначала, last, first, std :: bind1st (умножает (), 2)); – DavidN

+2

@DavidNeiss '[] (int i) {return 2 * i;}' короче и читабельнее (и менее устарело), ​​чем 'std :: bind1st (std :: multiplies (), 2)' и более современные 'std :: bind (std :: multiplies (), 2, std :: placeholders :: _ 1)'. – Casey

+0

Хорошо, если у вас есть C++ 11 lambdas, я определенно могу с вами согласиться. В наши дни мое предложение выглядит немного старой. – DavidN

Смежные вопросы