我已经用C++编程了很长一段时间了,但我偶尔偶然发现一个使用STL的代码片段,这会花费我很多时间和更多的代码来完成.
STL需要相当长的一段时间才能习惯,并且没有很多资源可以提供有关如何使用它的真实示例.请与我分享您最喜爱的STL功能!
fre*_*low 15
使用erase-remove-idiom 从线性时间中删除向量中的某些元素:
vec.erase(std::remove(vec.begin(), vec.end(), is_odd), vec.end());
Run Code Online (Sandbox Code Playgroud)
(手动循环向量并按元素进行擦除将是二次时间.)
chr*_*ris 11
dos2unix.cpp
#include <fstream>
#include <iterator>
#include <algorithm>
bool is_cr(char c) { return c == '\r'; }
int main(int, char* a[])
{
std::ifstream is("/dev/stdin");
std::ofstream os("/dev/stdout");
std::istreambuf_iterator<char> in(is), end;
std::ostreambuf_iterator<char> out(os);
remove_copy_if(in, end, out, is_cr);
}
Run Code Online (Sandbox Code Playgroud)
我记得当我偶然发现它(大约10年前)时我非常喜欢的一个comp.lang.c++.moderated:
int main(int argc, char* argv[])
{
std::vector arguments(argv+1, argv+argc);
// whatever
}
Run Code Online (Sandbox Code Playgroud)
今天,我不再使用它了.为什么要将这些东西放入一个向量中,然后由迭代器处理,当你已经有迭代器开始时?现在这并不是STL作为容器和算法的集合所关注的,而是它通过迭代器粘合序列和算法带来的更多想法:
template<typename It>
int process_arguments(It begin, It end)
{
// whatever we need to do with those arguments...
}
int main(int argc, char* argv[])
{
return process_arguments(argv+1, argv+argc);
}
Run Code Online (Sandbox Code Playgroud)
(是的,我经常写小型控制台实用程序.)
使用矢量作为缓冲区.代替:
int size_needed = GetData(NULL, 0);
char * buffer = new char[size_needed];
GetData(buffer, size_needed);
...
delete [] buffer;
Run Code Online (Sandbox Code Playgroud)
使用矢量:
int size_needed = GetData(NULL, 0);
std::vector<char> buffer(size_needed);
GetData(&buffer[0], size_needed);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2611 次 |
| 最近记录: |