以下内容大部分使用 C++11 !
以下内容大部分使用 C++11 !
以下内容大部分使用 C++11 !

通过 {} 来给容器赋值

pair<int, int> p;
// ...
p = make_pair(3, 4);

其实可以这样

pair<int, int> p;
// ...
p = {3, 4};

对于复杂的 pair

pair<int, pair<char, long long> > p;
// ...
p = {3, {'a', 8ll}};

对于其他容器(vector,deque,set)

vector<int> v;
v = {1, 2, 5, 2};
for (auto i: v)cout << i << ' ';
cout << '\n';
// prints "1 2 5 2"deque<vector<pair<int, int>>> d;
d = {{{3, 4}, {5, 6}}, {{1, 2}, {3, 4}}};
for (auto i: d) {for (auto j: i)cout << j.first << ' ' << j.second << '\n';cout << "-\n";
}
// prints "3 4
//         5 6
//         -
//     1 2
//     3 4
//     -"set<int> s;
s = {4, 6, 2, 7, 4};
for (auto i: s)cout << i << ' ';
cout << '\n';
// prints "2 4 6 7"list<int> l;
l = {5, 6, 9, 1};
for (auto i: l)cout << i << ' ';
cout << '\n';
// prints "5 6 9 1"array<int, 4> a;
a = {5, 8, 9, 2};
for (auto i: a)cout << i << ' ';
cout << '\n';
// prints "5 8 9 2"tuple<int, int, char> t;
t = {3, 4, 'f'};
cout << get<2>(t) << '\n';

注意:stack,queue不适用

通过 '#' 来得到参数名

#define what_is(x) cerr << #x << " is " << x << endl;
// ...
int a_variable = 376;
what_is(a_variable);
// prints "a_variable is 376"
what_is(a_variable * 2 + 1)
// prints "a_variable * 2 + 1 is 753"

使用 <bits/stdc++.h>

#include <bits/stdc++.h>

库中自带却不怎么常用的函数

  • __gcd(value1,value2)
    e.g. __gcd(18, 27) = 9.
  • __builtin_ffs(x)
    e.g. __builtin_ffs(10) = 2 because 10 is '...10 1 0' in base 2 and first 1-bit from right is at index 1 (0-based) ’and function returns 1 + index.
  • __builtin_clz(x)
    e.g. __builtin_clz(16) = 27 because 16 is ' ... 10000'. Number of bits in a unsigned int is 32. so function returns 32 — 5 = 27.
  • __builtin_ctz(x)
    e.g. __builtin_ctz(16) = 4 because 16 is '...1 0000 '. Number of trailing 0-bits is 4.
  • __builtin_popcount(x)
    e.g. __builtin_popcount(14) = 3 because 14 is '... 111 0' and has three 1-bits.

Note 还有其他 __bultin 函数,但是不怎么常用,cpp

变长参数函数与宏

int sum() { return 0; }template<typename... Args>
int sum(int a, Args... args) { return a + sum(args...); }int main() { cout << sum(5, 7, 2, 2) + sum(3, 4); /* prints "23" */ }

不止是 int

int sum() { return 0; }template<typename T, typename... Args>
T sum(T a, Args... args) { return a + sum(args...); }int main() { cout << sum(5, 7, 2, 2) + sum(3.14, 4.89); /* prints "24.03" */ }

C++14 可以用 auto sum(T a, Args... args)

使用宏

#define a_macro(args...) sum(args...)int sum() { return 0; }template<typename T, typename... Args>
auto sum(T a, Args... args) { return a + sum(args...); }int main() { cout << a_macro(5, 7, 2, 2) + a_macro(3.14, 4.89); /* prints "24.03" */ }

=> debug 函数

#include <bits/stdc++.h>using namespace std;#define error(args...) { vector<string> _v = split(#args, ','); err(_v.begin(), args); }vector<string> split(const string& s, char c) {vector<string> v;stringstream ss(s);string x;while (getline(ss, x, c))v.emplace_back(x);return move(v);
}void err(vector<string>::iterator it) {}
template<typename T, typename... Args>
void err(vector<string>::iterator it, T a, Args... args) {cerr << it -> substr((*it)[0] == ' ', it -> length()) << " = " << a << '\n';err(++it, args...);
}int main() {int a = 4, b = 8, c = 9;error(a, b, c);
}
/*
Output:a = 4b = 8c = 9
*/

C++0x 与 C++

遍历

set<int> s = {8, 2, 3, 1};
for (set<int>::iterator it = s.begin(); it != s.end(); ++it)cout << *it << ' ';
// prints "1 2 3 8"

上面代码好长呀,可以这样

set<int> s = {8, 2, 3, 1};
for (auto it: s)cout << it << ' ';
// prints "1 2 3 8"

可以用 &auto 来 替代 auto

vector<int> v = {8, 2, 3, 1};
for (auto &it: v)  it *= 2;
for (auto it: v)  cout << it << ' ';
// prints "16 4 6 2"

Power of auto

set<pair<int, pair<int, int> > >::iterator
可以这样写 auto it = s.begin()

for(i = 1; i <= n; i++) {for(j = 1; j <= m; j++)cout << a[i][j] << " ";cout << "\n";
}

等价于

for(i = 1; i <= n; i++)for(j = 1; j <= m; j++)cout << a[i][j] << " \n"[j == m];

tie 和 emplace_back

#define mt make_tuple
#define eb emplace_back
typedef tuple<int,int,int> State; // operator< definedint main(){int a,b,c;tie(a,b,c) = mt(1,2,3); // assigntie(a,b) = mt(b,a); // swap(a,b)vector<pair<int,int>> v;v.eb(a,b); // shorter and faster than pb(mp(a,b))// Dijkstrapriority_queue<State> q;q.emplace(0,src,-1);while(q.size()){int dist, node, prev;tie(dist, ode, prev) = q.top(); q.pop();dist = -dist;// ~~ find next state ~~q.emplace(-new_dist, new_node, node);}
}

emplace_backpush_back更快,紧跟末尾比在他处快?
tie 中可以使用 ignore 来忽略值

tuple<int, int, int, char> t (3, 4, 5, 'g');
int a, b;
tie(b, ignore, a, ignore) = t;
cout << a << ' ' << b << '\n';/*
Output:5 3
*/

利用宏来循环

#define rep(i, begin, end) for (__typeof(end) i = (begin) - ((begin) > (end)); i != (end) - ((begin) > (end)); i += 1 - 2 * ((begin) > (end)))
  • 不需要指明类型
  • 从 begin 到 end
vector<int> v = {4, 5, 6, 4, 8};
rep(it, end(v), begin(v))cout << *it << ' ';
// prints "8 4 6 5 4"

lambda function

[capture list](parameters) -> return value { body }
e.g.

auto f = [] (int a, int b) -> int { return a + b; };
cout << f(1, 2); // prints "3"

可以在 for_each,sort等 STL 中使用

vector<int> v = {3, 1, 2, 1, 8};
sort(begin(v), end(v), [] (int a, int b) { return a > b; });
for (auto i: v) cout << i << ' ';/*
Output:8 3 2 1 1
*/

move 的用法

使用move 来移动容器,不需要 copy

vector<int> v = {1, 2, 3, 4};
vector<int> w = move(v);cout << "v: ";
for (auto i: v)cout << i << ' ';cout << "\nw: ";
for (auto i: w)cout << i << ' ';
/*
Output:v: w: 1 2 3 4
*/

C++0x Strings

Raw Strings

string s = R"(Hello, World!)"; // Stored: "Hello, World!"
A raw string skips all escape characters like \n or \". e.g.string str = "Hello\tWorld\n";
string r_str = R"(Hello\tWorld\n)";
cout << str << r_str;/*
Output:Hello   World
Hello\tWorld\n
*/// You can also have multiple line raw string:string r_str =
R"(Dear Programmers,
I'm using C++11
Regards, Swift!)";
cout << r_str;/*
Output:
Dear Programmer,
I'm using C++11
Regards, Swift!
*/

Regular Expressions (regex)

** e.g.** regex r = "[a-z]+";

regex email_pattern(R"(^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$)");
// This email pattern is not totally correct! It's correct for most emails.
string
valid_email("swift@codeforces.com"),
invalid_email("hello world");if (regex_match(valid_email, email_pattern))cout << valid_email << " is valid\n";
elsecout << valid_email << " is invalid\n";if (regex_match(invalid_email, email_pattern))cout << invalid_email << " is valid\n";
elsecout << invalid_email << " is invalid\n";
/*
Output:swift@codeforces.com is valid
hello world is invalid
*/

更多资料

户定义数据标识 (User-defined literals)

栗子 0xA,1000ll,3.14f等等

long long operator "" _m(unsigned long long literal) {return literal;
}long double operator "" _cm(unsigned long long literal) {return literal / 100.0;
}long long operator "" _km(unsigned long long literal) {return literal * 1000;
}int main() {// See results in meter:cout << 250_m << " meters \n"; // Prints 250 meterscout << 12_km << " meters \n"; // Prints 12000 meterscout << 421_cm << " meters \n"; // Prints 4.21 meters
}

Note 需要添加下划线_
声明如下
[returnType] operator "" _[name]([parameters]) { [body] }
Note 参数仅能使用如下

(const char *)(unsigned long long int)(long double)(char)(wchar_t)(char16_t)(char32_t)(const char *, size_t)(const wchar_t *, size_t)(const char16_t *, size_t)(const char32_t *, size_t)

原贴
收录整理,以备复习

转载于:https://www.cnblogs.com/Forgenvueory/p/7352719.html

C++ Tricks相关推荐

  1. 转:45 Useful JavaScript Tips, Tricks and Best Practices

    原文来自于:http://flippinawesome.org/2013/12/23/45-useful-javascript-tips-tricks-and-best-practices/ 1 – ...

  2. 深度学习调参tricks总结!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:山竹小果,来源:NewBeeNLP 寻找合适的学习率(learni ...

  3. 提高 GPU 训练利用率的Tricks

    前言 首先,如果你现在还是在进行session.run(..)的话!尤其是苦恼于GPU显存都塞满了利用率却上不去的童鞋,这篇文章或许可以给你打开新世界的大门噢 如果发现经过一系列改良后训练效率大大提高 ...

  4. 数据竞赛Tricks集锦

    点击上方"Datawhale",选择"星标"公众号 第一时间获取价值内容 本文将对数据竞赛的『技巧』进行全面的总结,同时还会分享下个人对比赛方法论的思考.前者比 ...

  5. 目标检测比赛中的tricks集锦

    ↑ 点击蓝字 关注视学算法 作者丨初识CV@知乎 来源丨https://zhuanlan.zhihu.com/p/102817180 编辑丨极市平台 极市导读 本文总结了目标检测比赛中的8点技巧,包含 ...

  6. 目标检测中的Tricks

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 来自 | 知乎    作者 | roger 链接 | https: ...

  7. 亚马逊:用CNN进行图像分类的Tricks

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 来源: arXiv 编辑:刘晓坤.思源 自 2012 年 Alex ...

  8. Bag of Tricks for Efficient Text Classification论文阅读及实战

    本文目录 一.Fasttext算法综述 二.原理介绍及优化策略 三.Fasttext算法实战(注:以下代码仅在Linux系统下使用!) 四.参考资料 本文目录(仅做浏览用,暂时不支持页面内跳转) 一. ...

  9. YOLO在升级 | PP-YOLO v2开源致敬YOLOV4携带Tricks又准又快地归来(附论文与源码)...

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 表现SOTA!AP和速度的综合性能优于YOLOv5.EfficientDet等网络,其中一版本可达50 ...

  10. 从39个kaggle竞赛中总结出来的图像分割的Tips和Tricks(附资源)

    来源:AI公园 本文约2700字,建议阅读10分钟 本文与你分享参加了39个Kaggle比赛的技巧和经验. 想象一下,如果你能得到所有的tips和tricks,你需要去参加一个Kaggle比赛.我已经 ...

最新文章

  1. DS博客作业04--树大作业
  2. vgg11/13/16/19-pytorch实现
  3. 在Linux里使用dosbox运行debug.exe
  4. 闭包,sync使用细节
  5. HTML坐标不随着屏幕大小改变,HTML热区map坐标,随窗口大小自适应办法(javascript)...
  6. Gradle的好处:运行单个测试
  7. Android官方开发文档Training系列课程中文版:OpenGL绘图之环境配置
  8. 面试篇------性能测试+调优
  9. win10+mysql8.0安装
  10. 在Eclipse新建菜单中添加菜单项,其他地方添加菜单项类似
  11. C++ 返回值优化(RVO,Return Value Optimization)
  12. 螺旋数组,之字形数组
  13. ironpython怎么编译_将IronPython WPF项目编译为
  14. connection reset by peer
  15. 五子棋游戏AI智能算法设计
  16. php网页解析器,浅析php插件 HTMLPurifier HTML解析器
  17. windows 2008虚拟机的安装方法
  18. BATCH: A Scalable Asymmetric DiscreteCross-Modal Hashing--文献翻译
  19. I。quadratic equation 山东第八届省赛
  20. 创建视图时插入自增id

热门文章

  1. nyoj 寻找最大数
  2. Sedawk笔记之awk篇:快速了解Awk(三)
  3. winform c#绑定combobox下拉框 年度代码。
  4. 关闭fedroa19开关机画面
  5. linux如何映射Windows下的磁盘为网络盘
  6. 救援模式下解决boot.local修改后无法登陆系统
  7. 一些非常有用的备忘录文档
  8. ActiveMQ_使用经验
  9. zabbix mysql版本号_zabbix 监控mysql5.6版本 及主从
  10. springboot-quartz工程动态调度的实现