在C ++向量的每个元素上调用一个函数

时间:2012-05-09 12:49:50

标签: c++ function vector

在C ++中,有没有办法在向量的每个元素上调用一个函数,而不使用遍历所有向量元素的循环?类似于Python中的'map'的东西。

8 个答案:

答案 0 :(得分:38)

是:std::for_each

void foo(int a) {
    std::cout << a << "\n";
}

std::vector<int> v;

...

std::for_each(v.begin(), v.end(), &foo);

答案 1 :(得分:34)

您已经提到了几个提及std::for_each的答案。

虽然这些回答了您提出的问题,但我补充说,至少根据我的经验,std::for_each是关于至少对标准算法有用。

我使用(例如)std::transform,基本上a[i] = f(b[i]);result[i] = f(a[i], b[i]);std::for_each频繁得多。许多人经常使用std::for_each来打印集合的元素;为此目的,std::copystd::ostream_iterator作为目的地效果更好。

答案 2 :(得分:14)

在C ++ 11上:你可以使用lambda。例如:

std::vector<int> nums{3, 4, 2, 9, 15, 267};

std::for_each(nums.begin(), nums.end(), [](int &n){ n++; });

参考:http://en.cppreference.com/w/cpp/algorithm/for_each

答案 3 :(得分:8)

使用for_each

// for_each example
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

void myfunction (int i) {
  cout << " " << i;
}

struct myclass {
  void operator() (int i) {cout << " " << i;}
} myobject;

int main () {
  vector<int> myvector;
  myvector.push_back(10);
  myvector.push_back(20);
  myvector.push_back(30);

  cout << "myvector contains:";
  for_each (myvector.begin(), myvector.end(), myfunction);

  // or:
  cout << "\nmyvector contains:";
  for_each (myvector.begin(), myvector.end(), myobject);

  cout << endl;

  return 0;
}

答案 4 :(得分:7)

如果你有C ++ 11,那么方法更短:ranged-based for。它的目的正是如此。

std::vector<int> v {1,2,3,4,5};

for (int element : v)
    std::cout << element; //prints 12345

您也可以在适当的时候对它应用引用和const,或者在类型很长时使用auto。

std::vector<std::vector<int>> v {{1,2,3},{4,5,6}};

for (const auto &vec : v)
{
    for (int element : vec)
        cout << element;

    cout << '\n';
} 

输出:

123
456

答案 5 :(得分:2)

你可以使用带有一对迭代器和函数或函子的std::for_each

答案 6 :(得分:1)

我想我会分享 input_text = input("TYPE:") file = "library.txt" with open(file, "r") as txtFile: lines = txtFile.readlines() for line in lines: if input_text in line: print(line) std::rangesfor_each 等价物,如果有人喜欢的话:

transform

在 Godbolt 上运行:https://godbolt.org/z/zYME6b

答案 7 :(得分:0)

OP提到Python中的map函数。 该函数实际上将一个函数应用于列表的每个元素(或可迭代) 并返回收集所有结果的列表(或可迭代)。 换句话说,它会执行以下操作:

def f( x ) : 
   """ a function that computes something with x"""
   # code here 
   return y 

input = [ x1, x2, x3, ... ]
output = map( func, input )  

# output is  now [ f(x1), f(x2), f(x3), ...] 

因此,等效于Python映射的最接近的C ++标准库实际上是std::transform(来自`头)。

示例用法如下:

#include <vector>
#include <algorithm> 
using namespace std;

double f( int x ) { 
   // a function that computes the square of x divided by 2.0 
   return x * x / 2.0 ;
}

int main( ) {
  vector<int> input{ 1, 5, 10 , 20};
  vector<double> output;
  output.resize( input.size() ); // unfortunately this is necessary

  std::transform( input.begin(), input.end(), output.begin(), f );

  // output now contains  { f(1), f(5), f(10), f(20) }
  //                     = { 0.5, 12.5,  50.0, 200.0 } 
  return 0;
}