//创造一个tuple<int, const char*, double> auto example = std::make_tuple(1, "tuple", 20.00); auto first = std::get<0>(example); //first是int型,等于1 auto len = std::tuple_size<decltype(example)>::value; //tuple长度为3 std::tuple_element<0, decltype(example)>::type x; //x是int auto example2 = std::make_tuple(1, "tuple", 20.00); bool is_equal = (example == example2); // true bool less_than = (example < example2); // false
tuple最有用的地方是让一个函数同时返回多个值,就像python和golang里面那样,这在c++17提供了structured binding功能之后就非常像了。
constexpr int kSuccess = 0; constexpr int kError = -1; auto func_return_tuple() { int result = 2; return std::make_tuple(kSuccess, result); } auto [err_code, result] = func_return_tuple(); //使用structured binding直接解开tuple
std::bitset<32> b1(0xff); //从一个大整型初始化,不足的高位填0,超出则截断 std::bitset<32> b2("1100"); //从一个01的字符串初始化 b1.any(); //检查是否至少有一个bit为1 b1.all(); //检查是否所有bit都为1 b1.none(); //检查是否所有bit都为0 b1.set(0); //0位置1,不加参数的set调用全体置1 b1.reset(0); //0位置0,不加参数的reset调用全体置0 b1.flip(0); //0位置翻转,不加参数的flip调用全体置翻转 b1[0] = 1; //下标访问 b1[0].flip(); //下标访问+翻转 b1.to_ulong(); //转成unsigned long,还有to_ullong转成unsigned long long b1.to_string(); //转成字符串
在我的mac上实测,bitset最多支持到32M个bit,想用它解决著名的int32_t的bitmap问题的少侠们要失望了,得多来一些组合起来才行。
std::string pattern = "[[:alpha:]][^c]ei[[:alpha:]]"; //匹配一个包含ei,但是不包含cei的单词 std::regex r(pattern); //初始化 std::smatch results; //结果放这里 std::string test_str = "receipt friend theif receive"; //目标串 if (regex_search(test_str, results, r)) { //查找子串匹配 std::cout << results.str() << std::endl; //利用查找结果 }
std::sregex_iterator it(test_str.begin(), test_str.end(), r); std::sregex_iterator end_it; for (; it != end_it; ++it) { //遍历所有结果 std::cout << it->str() << std::endl; }
results.prefix(); //拿前缀 results.suffix(); //拿后缀 std::string pattern2 = "([[:alpha:]])([^c]ei)([[:alpha:]])"; //匹配一个包含ei,但是不包含cei的单词 std::regex r2(pattern2); //初始化 std::smatch results2; //结果放这里 if (regex_search(test_str, results2, r2)) { //查找子串匹配 std::cout << results2[0].str() << std::endl; //打印整体匹配结果 std::cout << results2[1].str() << std::endl; //打印第一个匹配结果 std::cout << results2[2].str() << std::endl; //打印第二个匹配结果 std::cout << results2[3].str() << std::endl; //打印第三个匹配结果 }
string fmt = "$1-$2-$3"; std::cout << regex_replace(test_str, r2, fmt) << std::endl; //结果为:receipt f-rei-nd t-hei-f receive
std::random_device rd; //使用随机设备生成值作为种子 std::default_random_engine e(rd()); //默认随机引擎,推荐使用std::mt19937 std::uniform_int_distribution<int> d(0, 9); //生成一个0~9的均匀随机分布 for(int i = 0; i < 10; ++i) { std::cout << d(e) << std::endl; //使用引擎调用随机分布获得随机数 }
bool b = true; std::cout << std::boolalpha << b << std::noboolalpha << std::endl; //输出true而不是1
更多的格式操纵符还有:
名称 | 作用 | 相反操作 |
---|---|---|
boolalpha | bool值显示为true和false | noboolalpha |
showbase | 显示进制 | noshowbase |
showpoint | 总是显示小数点 | noshowpoint |
dec/hex/oct | 10进制/16进制/8进制 | dec/hex/oct |
skipws | 输入跳过空白 | noskipws |
char ch; std::cin.get(ch); //从cin中读取一个字符 std::cout.put(ch); //向cout中输出一个字符 char buffer[10] = {}; std::cin.get(buffer, 10, '\n'); //读10个字符上来,或者遇到回车截止 std::cin.getline(buffer, 10, '\n'); //读一行上来,或者10个或者遇到回车截止 std::cout.write(buffer, 10); //输出10个字符