使用STL会降低程序可读性??

madbunny 2012-12-28 11:22:43
今天头一次自己做一个大模块。
我图方便,循环使用了for_each 和 bind 组合起来用,因为我实在讨厌写迭代器的声明;模块内部为了方便内存管理我都是使用了智能指针,然后typedef成一个XXXPtr的类型;而且也没有使用项目组里广泛使用的map,而是使用了unordered_map,因为我觉得能提高性能。
今天评审代码,说我的代码到处都是STL,可读性很差。“要是我读这个代码,肯定读不明白。”
我对说这话的同事印象还挺好的,人很聪明,而且能看的进去别人的代码。很多老旧的模块他都能看懂。
为啥他这样说呢?
STL真的会破坏可读性么?
...全文
973 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
madbunny 2013-01-02
  • 打赏
  • 举报
回复
//for_each bind
std::sort(line1.begin(),line1.end(),bind(cmp_radian_xAxis_forward_direction,P1,_1,_2));
for_each(node1.begin(),node1.end(),bind(&vector<CBLF_Line*>::push_back,line1,_1));
//shared_ptr
typedef vector<CBLF_Line*> BFSVector;// broad-first search queue of some connected graph
typedef shared_ptr<BFSVector> BFSVectorPtr;
//unordered_map
typedef unsigned long long ULL;
typedef unordered_set<CBLF_Line*> graph_node;
typedef unordered_map<ULL,graph_node> graph;
typedef unordered_set<CBLF_Line*> BLF_LineSet;
stereoMatching 2012-12-30
  • 打赏
  • 举报
回复
修改

A::iterator begin = A.begin();
A::iterator end = A.end();
for(it = begin; it != end; ++it){...}
stereoMatching 2012-12-30
  • 打赏
  • 举报
回复
>比如 for_each(v.begin(), v.end(), fun)这样的代码,不熟悉STL的人当然认为循环可读性好 如果c++11不支援lambda的话,我也懒得用for_each处理一些小case 性能要求比较高,用c++98时顶多是这样写

A::iterator end = A.end();
for(A::iterator it = A.begin(); it != end; ++it){...}
在c++11中for_each大部分时候也可以用range based for loop取代

for(auto const &data : input){
...}
>搞C++真要非常熟悉STL才行 这点我赞同
Kaile 2012-12-30
  • 打赏
  • 举报
回复
不熟悉STL的人当然感觉可读性差,不懂的人以后无法维护,所以怕STL。 比如 for_each(v.begin(), v.end(), fun)这样的代码,不熟悉STL的人当然认为循环可读性好 搞C++真要非常熟悉STL才行
jimette 2012-12-30
  • 打赏
  • 举报
回复
引用 27 楼 ForestDB 的回复:
聊点题外话 最近在看Clean Code 很有感触 感觉可读性,不在于你是用STL还是boost,或是其他库亦或自己的库 而是你对库包装到一个什么程度 LZ可以把很有代表性的代码,精简下,发出来,群众的眼睛是明亮的
对发个代码瞧瞧吧
ryfdizuo 2012-12-30
  • 打赏
  • 举报
回复
up~ 做移动开发,很少用stl这类库。。。
madbunny 2012-12-30
  • 打赏
  • 举报
回复
引用 27 楼 ForestDB 的回复:
聊点题外话 最近在看Clean Code 很有感触 感觉可读性,不在于你是用STL还是boost,或是其他库亦或自己的库 而是你对库包装到一个什么程度 LZ可以把很有代表性的代码,精简下,发出来,群众的眼睛是明亮的
不在公司啊,手上没有。到公司了贴点过来吧。不过估计那个时候你们都不关注了。
madbunny 2012-12-30
  • 打赏
  • 举报
回复
引用 25 楼 Emiyasstar__ 的回复:
不熟悉stl的人看stl确实满蛋疼的,另外出了错也更麻烦一些
这个我很同意,很多时候就是一个空指针而已,使用了容器的话,就不一定报的是什么错误了。
redleaves 2012-12-30
  • 打赏
  • 举报
回复
一直觉得代码的整体可读性比局部可读性重要得多. 小的代码片段再混乱,糟糕也是有限度的.而整体结构上的混乱那将是致命的. stl对于不熟悉语法的人来说,的确是容易引起困扰. 即便是明白语法,如果不能完全掌握其实现细节,在有些时候还是会带来一些困扰.
tag180 2012-12-30
  • 打赏
  • 举报
回复
可读性是人为的~~跟STL有什么关系~~
bigwangdi 2012-12-30
  • 打赏
  • 举报
回复
一个团队使用的技术和代码风格应该有一个标准,要不然每个人擅长的东西都不一样,大家写的代码谁也看起来不顺眼,岂不是很郁闷
taodm 2012-12-29
  • 打赏
  • 举报
回复
大量使用shared_ptr一定是作茧自缚 另外,RAII和shared_ptr可不是那么等同的。 要大量使用RAII,并且少用shared_ptr
赵4老师 2012-12-29
  • 打赏
  • 举报
回复
STL容易产生内存碎片。
stereoMatching 2012-12-29
  • 打赏
  • 举报
回复
可能是你误用,也可能是对方不懂stl 如果是后者,这种态度不值得学习,作茧自缚 经验尚浅的我发现一个很讨厌的现象 对搞IT的人来说,所谓的“经验”有时候只是一种累赘 因为他们对XXX经验丰富,所以他们解决问题的时候 会倾向于把全部的问题都用XXX的方法解决 一旦遇到了自己没有接触过的技术,不同的做法 他们的态度除了排斥以外就是抹黑 完全没有一丝丝想学习的念头 对很多上了年纪的人来说这种现象更加普遍 出社会后最常见到的态度是“倚老卖老” 而非"活到老,学到老" 我很希望这只是我的错觉,或者只是年少轻狂的诳语 我个人是c过渡到c++的,妥善利用的话 不明白为何stl会导致可读性低 一个读取文件里头的double,排序并重新输出的程序 输入档 http://www.sendspace.com/file/4ypqdz stl

//比较简洁,速度可能比较慢
void CPP_SOLUTION_ONE()
{  
  std::ifstream inFile("before.txt");
  std::vector<double> data( ( std::istream_iterator<double>(inFile) ), std::istream_iterator<double>() );
  std::sort(std::begin(data), std::end(data) );

  std::ofstream outFile("after.txt");
  std::copy(std::begin(data), std::end(data), std::ostream_iterator<double>(outFile, "\n") ); 
}

//比较烦杂,速度可能比较快
void CPP_SOLUTION_TWO()
{  
  FILE *fin = fopen("before.txt", "r");
  std::vector<double> data;
  double number = 0;
  while( fscanf(fin, "%lf", &number) == 1 ) data.push_back(number);

  fclose(fin);
  std::sort(std::begin(data), std::end(data) );

  std::ofstream outFile("after.txt");
  std::copy(std::begin(data), std::end(data), std::ostream_iterator<double>(outFile, "\n") );  
}
纯C

#include<stdlib.h>
#include<stdio.h>

int compare(void const *p, void const *q)
{
  double p0 = *(double*)p;
  double q0 = *(double*)q;

  if(p0 > q0) return 1;
  else if(p0 < q0) return -1;

  return 0;
}

void quit()
{
  fprintf(stderr, "memory exhausted\n");
  exit(1);
}

void C_SOLUTION()
{
  int res = 1000; //initial allocation

  double *buf = (double*)malloc(sizeof(double) * res);
  if(buf == 0) quit();

  int n = 0; //number of elements
  int i = 0;
  FILE *fin = fopen("before.txt", "rt");
  double d;
  while( fscanf(fin, "%lf", &d) == 1 )
  {
    if(n == res)
    {
      res += res;
      buf = (double*)realloc(buf, sizeof(double) * res );
      if(buf == 0) quit();
    }
    buf[n++] = d;
  }
  fclose(fin);
  qsort(buf, n, sizeof(double), compare);

  FILE *fout = fopen("after.txt", "wt");
  for(i = 0; i != n; ++i) fprintf(fout, "%f\n", buf[i]);

  fclose(fout);
  free(buf);
}
对于熟悉stl语法的人而已,那个比较容易阅读?
ForestDB 2012-12-29
  • 打赏
  • 举报
回复
聊点题外话 最近在看Clean Code 很有感触 感觉可读性,不在于你是用STL还是boost,或是其他库亦或自己的库 而是你对库包装到一个什么程度 LZ可以把很有代表性的代码,精简下,发出来,群众的眼睛是明亮的
  • 打赏
  • 举报
回复
for_each 和 bind 组合起来确实很难读(不是读懂读不懂的问题)最好写成局部的函数对象。 绝大多数场合是不需要unordered_map的,效率说不定还低于map。
dahaiI0 2012-12-29
  • 打赏
  • 举报
回复
学习。。。。
stereoMatching 2012-12-29
  • 打赏
  • 举报
回复
引用 21 楼 madbunny 的回复:
引用 17 楼 akirya 的回复:绝大多数场合是不需要unordered_map的,效率说不定还低于map。 hash查询和插入不是常数复杂度么?为啥大多数场合不需要呢?
一般来说 一是他比起red black tree更耗费空间 二是在资料量低的时候,map效率更高 我忽然想起另外一个滥用shared_ptr的情况

vector<shared_ptr<string>> weird_codes;
除非你要share那个string,否则这种情况根本没有使用shared_ptr的必要 shared_ptr没必要的话就少用点,多用unique_ptr(没的话可考虑auto_ptr) smart pointer的精神是RAII,但不见得所有的资源都要交给smart pointer管理 这也是RAII

vector<myObject> A;
引用 18 楼 zhao4zhong1 的回复:
STL容易产生内存碎片。
STL确实有可能产生内存碎片,但是直接用手工分配记忆体 难道就不会造成内存碎片吗?这不是stl才有的问题 只要你频繁的分配更大的记忆体,释放掉旧的记忆体 fragmentation就无法避免,我们只能想办法缓和他的冲击 如果记忆体需要频繁的分配和释放,可以自己设计一个pool 只是单纯的malloc,free,new,delete 其实结果也跟使用stl没什么两样,搞不好还更糟 如果因为这个理由就完全不使用设计水平远在 一般水准之上的标准库,无异于因噎废食 always worry about performance and efficiency when your profiler tells you
Emiyasstar__ 2012-12-29
  • 打赏
  • 举报
回复
不熟悉stl的人看stl确实满蛋疼的,另外出了错也更麻烦一些
stereoMatching 2012-12-29
  • 打赏
  • 举报
回复
美化一下

class someClass{
  public :
    someClass() 
    {
      a = new someObject;
      //throw exception
      b= new someObject;
    }
    
    ~someClass() { delete a; delete b;}
private:
   someObject *a;
   someObject *b;
};

std::mutex lk;

void mfunction(){
  lk.lock()
  //do something and throw exception
  lk.unlock(); //永远不会被解锁
}
加载更多回复(17)

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧