你最喜欢的STL技巧是什么?

chr*_*ris 11 c++ stl

我已经用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)

  • 你能不能这样做:`remove_copy(in,end,out,'\ r')`并避免定义`is_cr()`? (2认同)

sbi*_*sbi 8

我记得当我偶然发现它(大约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)

(是的,我经常写小型控制台实用程序.)

  • 你可能是说`std :: vector some_cool_variable_name(argv + 1,argv + argc);`对吗?因为否则它是一个死于分号的临时向量。 (2认同)
  • @Fred:`&lt;slaps_head&gt; (2认同)

Mar*_*som 7

使用矢量作为缓冲区.代替:

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)