c++业务实践

| 分类 技术  | 标签 业务开发 

前言

本文列举出业务开发中常用的c++技巧和使用经验(不断补充)……

语法注意点

  1. c++中可以用0表示false,用非0表示true
  2. c打印bool,直接用prinf %d,如果为false则打印0;否则打印1
  3. c++ map类型可以直接使用没有key的value,value为default值
  4. c++ string convert int使用atoi; int convert string使用std:to_string()(添加-std=c++11参数)
  5. 函数模板在头文件中声明和实现

常用技巧

  • 1 遍历vector

第一种方式:用下标遍历:

vector<int> v;
for (size_t i = 0; i < v.size(); i++)
{
    v[i] ...
}

第二种方式:用迭代器遍历:

vector<int> v;
for (vector<int>::iterator it = v.begin(); it != v.end(); ++it)
{
    *it ...
}
  • 2 vector遍历剔除
vector<int> v;
for (vector<int>::iterator it = v.begin(); it != v.end(); )
{
    if (xxx)
    {
        it = v.erase(it);
    }
    else
    {
        ++it;
    }
}
  • 3 vector查找元素是否存在
vector<int> v;
vector<int>::iterator it = std::find(v.begin(), v.end(), xxx);
if (it != v.end())
{
    //处理存在情况
}
else
{
    //处理不存在情况
}
  • 4 map查找某个元素是否存在
map<int, string> m;
map<int, string>::iterator it = m.find(xxx);
if (it != m.end())
{
    //处理存在情况
}
else
{
    //处理不存在情况
}
  • 5 unordered_set转vector
std::unordered_set<int> u_s;
u_s.insert(xxx);
vector<int> v;
v.insert(v.end(), u_s.begin(), u_s.end());
  • 6 vector转unordered_set
vector<int> v;
v.push_back(xxx);
std::unordered_set<int> u_s(v.begin(), v.end());
  • 7 产生1——10随机化数字
srand (time(NULL));
j = 1 + (int) (10.0 * (rand() / (RAND_MAX + 1.0)));

If you want to generate a random integer between 1 and 10, you should always do it by using high-order bits, as in

                j = 1 + (int) (10.0 * (rand() / (RAND_MAX + 1.0)));
         and never by anything resembling
                j = 1 + (rand() % 10);
         (which uses lower-order bits).
  • 8 遍历map
for (std::map<int, string>::iterator it=m.begin(); it != m.end(); ++it)
    std::cout << it->first << " => " << it->second << '\n';
  • 9 string去除最后一个字符
    string str;
    str = "123456";
    cout << str << endl;

    //方法一:使用substr()
    str = str.substr(0, str.length() - 1);
    cout << str << endl;

    //方法二:使用erase()
    str.erase(str.end() - 1);
    cout << str << endl;
  • 10 vector插入首部
vector<int> MyVector;

for (int i = 0; i < 10; i++)
    MyVector.insert(MyVector.begin(),i); // Inserts the value i at the start of the array 10 times.

for (vector<int>::iterator it=MyVector.begin(); it<MyVector.end(); it++)
    cout << *it; //Outputs the values of MyVector in order 
  • 11 time获取
#include <stdio.h>
#include <string>
#include <cstdlib>
#include <memory.h>
using namespace std;

char strtm[1024];
time_t nowtime = time(0);
struct tm sttm;
memset(&sttm, 0, sizeof(sttm));
localtime_r((time_t *)&nowtime, &sttm);
snprintf(strtm, sizeof(strtm), "%04d-%02d-%02d %02d:%02d:%02d",
        sttm.tm_year + 1900, sttm.tm_mon + 1, sttm.tm_mday,
        sttm.tm_hour, sttm.tm_min, sttm.tm_sec);
printf("%s\n", strtm);

c++编程思想

  • 尽量用函数,避免代码臃肿
  • 尽量用引用传参,避免开销
  • STL尽可能使用常用的容器:vector、map、set等,完全足够大多数业务场景——越简单的容器用起来越不容易出错

业务开发&平台开发

  • 业务开发节奏快;平台开发相对时间充裕(加班少)
  • 业务开发对接’可见’的产品,需要对产品熟悉(有些时候,甚至比需求提出方更加熟悉);平台开发一般是基础部门,可能大多数时候自己并不了解使用自己平台的业务
  • 业务开发对知识的要求是:全而杂(核心是尽快把需求搞定,所以往往对某一个技术领域没有深钻);平台开发则相反,目标是成为某个领域的’专家’
  • 业务开发对接工程思维;平台开发对接专家思维
  • 业务开发需求变更快;平台开发则相对稳定
  • 业务开发大多写逻辑代码,对计算机底层包括整个架构的理解要求没有平台开发高
  • 平台开发可以接触各种语言:go、scala、java、c/c++、perl、python、shell、c#等;业务开发则开发语言相对固定,通常只会使用1到2种语言
  • 业务开发对需求驱动力要求更高,毕竟时间紧,任务急
  • 平台开发对新知识的学习能力以及英文阅读能力要求更高(以前工作基本每天都要学习新的开源知识)
  • 业务开发成就感相对更高,小需求1天,大需求1周;平台开发可能一个需求就一年半载,还不出成果
  • 业务开发注重沟通,与产品,客户端,测试,包括合作部门各种交流沟通,很多时候会撕逼;平台开发相对而言环境更加纯粹,没有那么多撕逼烦心的事情,可以安心的做技术
  • 业务开发相对工资会更高一些,毕竟是直接盈利;而平台开发则很多是基础部门,没有和’赚钱’挂钩,所以不会那么有‘钱途’
  • 业务开发可能会常常被催着做事情;而平台开发一般领导丢给你一个任务,也不会多问,隔一段时间问一下进展,个人觉得这样是很好的,对于个人成长是大有裨益的(遇到这样的领导也是很爽的) :)

业务开发(APP开发)流程

Refs


上一篇     下一篇