transform和back_inserter
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
std::string s("Hello");
std::string f;

// 前两个参数是变换的范围,第三个是变换的起始位置
// 第四个参数为lambda表达式,变换的规则
std::transform(s.begin(), s.end(), s.begin(),
[](unsigned char c) { return std::toupper(c); });
std::cout <<"after transform, s: "<< s << std::endl; // HELLO

std::transform( s.begin(), s.end(), std::back_inserter(f),
[](unsigned char c) { return std::tolower(c); } );
std::cout << "after transform, f: " << f << std::endl; // hello

std::copy( s.begin(), s.end(), std::back_inserter(f) );
std::cout << "after copy, f: " << f << std::endl; // helloHELLO

back_inserter属于插入迭代器,有三种插入迭代器(back_inserter,inserter,front_inserter),插入迭代器是指被绑定在一个容器上,可用来向容器插入元素的迭代器。 back_inserter是创建一个使用push_back的迭代器

1
2
3
vector<int> v={1,2,3,4,5,6};
vector<int> s;
copy(v.begin(), v.end(), back_inserter(s) ); // s: 123456

追加数据比较适合这种copy+back_inserter的做法。如果把新数据转为string,再用string的+运算符,这就太复杂了。数据很有可能是不以'\0'结尾,这样的话将出现严重bug。