第十七章 标准库特殊设施
17.1 tuple类型
- 当希望将一些数据合成单一对象,但又不想麻烦地定义一个新数据结构来表示这些数据时,tuple非常有用。
- tuple是类似pair的模板。
tuple<size_t, size_t, size_t> threeD; //三个成员都设置为0//为每个成员提供初始值
tuple<string, vector<double>, int, list<int>>someVal("constants", {3.14,2,718},42,{0,1,2,3,4,5});//tuple的这个构造函数是explicit的
tuple<size_t,size_t,size_t> threeD = {1,2,3}; //错误
tuple<size_t,size_t,size_t> threeD{1,2,3}; //正确//表示书的交易记录的tuple,包含:ISBN、数量和每册书的价格
auto item = make_tuple("0-999-78345-X",3,20.00);
17.1.1 定义和初始化tuple
- 要访问一个tuple的成员,就要使用一个名为get的标准库函数模板。为了使用get,必须指定一个显式模板实参,它指出想要访问第几个成员。
auto book = get<0>(item); //返回item的第一个成员
auto cnt = get<1>(item); //返回item的第二个成员
auto price = get<2>(item)/cnt; //返回item的最后一个成员
get<2>(item) *= 0.8; //打折20%typedef decltype(item) trans; //trans是item的类型
//返回trans类型对象中成员的数量
size_t sz = tuple_size<trans>::value; //返回3
//cnt的类型与item中第二个成员相同
tuple_element<1,trans>::type cnt = get<1>(item); //cnt是一个int
- 由于tuple定义了<和==运算符,可以将tuple序列传递给算法,并且可以在无序容器中将tuple作为关键字类型。
tuple<string, string> duo("1","2");
tuple<size_t,size_t> twoD(1,2);
bool b = (duo == twoD); //错误:不能比较size_t和string
tuple<size_t, size_t, size_t> threeD(1,2,3);
b = (twoD < threeD); //错误:成员数量不同
tuple<size_t,size_t> origin(0,0);
b = (origin < twoD); //正确:b为true
17.1.2 使用tuple返回多个值
- tuple的一个常见用途是从一个函数返回多个值。
17.2 bitset类型
17.2.1 定义和初始化bitset
- bitset类是一个类模板,类似array类,具有固定的大小,当定义一个bitset时,需要声明它包含多少个二进制位。
bitset<32> bitvec(1U); //32位;低位为1,其他位为0
- 当使用一个整型值来初始化bitset时,此值将被转换为unsigned long long类型并被当作位模式来处理。
//bitvec1比初始值小;初始值中的高位被丢弃
bitset<13> bitvec1(0xbeef); //二进制位序列为1111011101111
//bitvec2比初始值大;它的高位被置为0
bitset<20> bitvec2(0xbeef); //二进制位序列00001011111011101111
//在64位机器中,long long OULL是一个64个0比特,因此~0ULL是64个1
bitset<128> bitvect3(~0ULL); //0~63位为1;64~127位为0
- string的下标编号习惯与bitset恰好相反:string中下标最大的字符(最右字符)用来初始化bitset中的低位(下标为0的二进制位)。当用一个string初始化一个bitset时,要记住这个差别。
bitset<32> bitvec4("1100"); //2,3两位为1,剩余两位为0string str("1111111000000011001101");
bitset<32> bitvec5(str,5,4); //从str[5]开始的四个二进制位,1100
bitset<32> bitvec6(str,str.size()-4); //使用最后四个字符
17.2.2 bitset操作
- 如果bitset中的值不能放入给定类型中,to_ulong和to_ullong操作会抛出一个overflow_error异常。
bitset<32> bitvec(1U); //32位;低位为1,剩余位为0
bool is_set = bitvec.any(); //true,因为有1位置位
bool is_not_set = bitvec.none(); //false,因为有1位置位了
bool all_set = bitvec.all(); //false,因为只有1位置位
size_t onBits = bitvec.count(); //返回1
size_t sz = bitvec.size(); //返回32
bitvec.flip(); //翻转bitvec中的所有位
bitvec.reset(); //将所有位复位
bitvec.set(); //将所有位置位bitvec[0] = 0; //将第一位复位
bitvec[31] = bitvec[0]; //将最后一位设置为与第一位一样
bitvec[0].flip(); //翻转第一位
~bitvec[0]; //等价操作,也是翻转第一位
bool b = bitvec[0]; //将bitvec[0]的值转换为bool类型
unsinged long ulong = bitvec3.to_ulong();
cout<<"ulong = " << ulong <<endl;
//bitset中的值的大小,不能大于转换的类型
//否则会抛出overflow_error异常
bitset<16> bits;
cin >> bits; //从cin读取最多16个0或1
cout << "bits: "<< bits <<endl; //打印刚刚读取的内容
bool status;
//使用位运算符的版本
unsigned long quizA = 0; //此值被当做位集合使用
quizA |= 1UL << 27; //指出第27个学生通过了测试
status = quitzA & (1UL <<27); //检查第27个学生是否通过了测试
quizA &= ~(1UL << 27); //第27个学生未通过测试//使用标准库类bitset
bitset<30> quizB; //每个学生分配一位,所有位都被初始化为0
quizB.set(27); //指出第27个学生通过了测试
status = quizB[27]; //检查第27个学生是否通过了测试
quizB.reset(27); //第27个学生未通过测试
17.3 正则表达式
17.3.1 使用正则表达式库
- 正则表达式是一种描述字符序列的方法,是一种及其强大的计算工具。
//查找不在字符c之后的字符串ei
string pattern("[^c]ei");
//我们需要包含pattern的整个单词
pattern = "[[:alpha:]]*" + pattern + "[[:alpha:]]*";
//regex:表示有一个正则表达式的类
regex r(pattern); //构造一个用于查找模式的regex
//smatch:容器类,保存在string中搜索的结果
smatch results; //定义一个对象保存搜索结果string test_str = "receipt freind theif receive";
//regex_search:寻找第一个与正则表达式匹配的子序列
//用r在test_str中查找与pattern匹配的子串
if(regex_search(test_str, results, r))//如果有匹配子串cout << results.str() << endl; //打印匹配的单词
- 指定regex对象的选项:指定一些标志来影响regex如何操作。
//识别扩展名
//一个或多个字母或数字字符后接一个'.'再接"cpp"或"cxx"或"cc"
//regex::icase在匹配中忽略大小写
regex r("[[:alnum:]]+\\.(cpp|cxx|cc)$", regex::icase);
smatch results;
string filename;while(cin >> filename)if(regex_search(filename, results, r))cout << results.str() << endl;//打印匹配结构
- 一个正则表达式的语法是否正确是在运行时解析的。如果编写的正则表达式存在错误,则在运行时标准库会抛出一个类型为regex_error的异常。
try {//错误:alnum漏掉了右括号,构造函数会抛出异常regex r("[[:alnum:]+\\.(cpp|cxx|cc)$", regex::icase);
} catch (regex_error e){ cout << e.what() << "\ncode:" << e.code() << endl; }
- 正则表达式类和输入序列类型
regex r("[[:alnum:]]+\\.(cpp|cxx|cc)$",regex::icase);
smatch results; //将匹配string输入序列,而不是char*
//cmatch results; //将匹配字符数组输入序列
if( regex_search("myfile.cc", results, r)) //错误:输入为char*cout << results.str() << endl;
- 避免创建不必要的正则表达式,特别是在一个循环中使用正则表达式,应该在循环外创建它,而不是在每步迭代时都编译它。
17.3.2 匹配与Regex迭代器类型
- 使用sregex_iterator来获得所有匹配。
string file("Hello cei world freind meizhu");
//查找前一个字符不是c的字符串ei
string pattern("[^c]ei");
pattern = "[[:alpha:]]*" + pattern + "[[:alpha:]]*";
regex r(pattern, regex::icase);
//它将反复调用regex_search来查找文件中的所有匹配
for(sregex_iterator it(file.begin(), file.end(), r), end_it; it != end_it; ++it)cout << it->str() << endl; //匹配的单词
17.3.3使用子表达式
- 正则表达式语法通常用括号表示子表达式。
//两个子表达式:1、点之前表示文件名的部分,2、表示文件扩展名
regex r("([[:alnum:]]+)\\.(cpp|cxx|cc)$",regex::icase);
smatch results;
string filename;
while(cin >> filename)if(regex_search(filename, results, r))cout << results.str(1) << endl; //打印第一个子表达式
- 子表达式的一个常见用途是验证必须匹配特定格式的数据。
"(\\()?(\\d{3})(\\))?([-. ])?(\\d{3})([-. ])?(\\d{4})";
17.3.4使用regex_replace
- 正则表达式不仅可以用来查找一个给定序列,还可以用来将找到的序列替换为另一个序列,可以调用regex_replace。
using namespace regex_constants;
int main() {string phone = "(\\()?(\\d{3})(\\))?([-. ])?(\\d{3})([-. ])? (\\d{4})"; regex r(phone); //regex对象,用于查找我们的模式string fmt = "$2.$5.$7"; //将号码格式改为ddd.ddd.ddddstring fmt2 = "$2. $5. $7"; string number = "(908) 555-1800";cout << regex_replace(number, r, fmt) << endl;cout << regex_replace(number, r, fmt2, format_no_copy) << endl;number = "(08) 555-1800";cout << regex_replace(number, r, fmt) << endl;//format_no_copy默认不匹配就原样输出cout << regex_replace(number, r, fmt2, format_no_copy) << endl;
}
17.4 随机数
- C++程序不应该使用库函数rand,而应该使用default_random_engine类和恰当的分布类对象。
#include <iostream>
#include <random>
using namespace std;int main()
{default_random_engine e; //生成随机无符号数for(size_t i = 0; i < 5; ++i)cout << e() << " ";cout << endl;default_random_engine e2;for(size_t i = 0; i < 5; ++i)cout << e2() << " ";
}
17.4.1 随机数引擎和分布
-
随机数引擎是函数对象类,它们定义了一个调用运算符,该运算符不接受参数并返回一个随机unsigned整数。
-
分布类型定义了一个调用运算符,接受一个随机引擎作为参数。分布对象使用它的引擎参数生成随机数,并将其映射到指定的分布。
//生成0到9之间(包含)均匀分布的随机数
uniform_int_distribution<unsigned> u(0,9);
default_random_engine e; //生成无符号随机整数
for(size_t i = 0; i < 10; ++i)//将u作为随机数源//每个调用返回执行范围内并服从均匀分布的值cout << u(e) << " ";
- 当我们说随机数发生器时,是指分布对象和引擎对象的组合。
- 一个给定的随机数发生器一直会生成相同的随机数序列。一个函数如果定义了局部的随机数发生器,应将其(包括引擎和分布对象)定义为static的。否则,每次调用函数都会生成相同的序列。
//每次调用这个函数都会生成相同的100个数!
vector<unsigned> bad_randVec() {default_random_engine e;uniform_int_distribution<unsigned> u(0,9);vector<unsigned> ret;for(size_t i = 0;i < 100; ++i)ret.push_back(u(e));return ret;
}int main() {vector<unsigned> v1(bad_randVec());vector<unsigned> v2(bad_randVec());//将打印“equal”cout << ((v1 == v2) ? "equal":"not equal") << endl;
}
- 为引擎设置种子有两种方式:在创建引擎对象时提供种子,或者调用引擎的seed成员。
default_random_engine e1; //使用默认种子
default_random_engine e2(3147442); //使用给定的种子
default_random_engine e3; //使用默认种子
e3.seed(32767); //调用seed设置一个新种子
default_random_engine e4(32767); //将种子设置为32767
for(size_t i = 0; i != 100; ++i) {if(e1() == e2())cout << "unseeded match at literation:" << i << endl;if(e3() != e4())cout << "seeded differs at literation:" << i << endl;
}
- 如果程序作为一个自动过程的一部分反复运行,将time的返回值作为种子的方式就无效了;它可能多次使用的都是相同的种子。
//以时间为种子:只适用于间隔为秒级或更长的应用
default_random_engine e(time(0));
17.4.2 其他随机数分布
- 当希望使用默认随机数类型时要记得在模板名之后使用空尖括号。
default_random_engine e; //生成无符号随机整数
//0到1(包含)的均匀分布
uniform_real_distribution<double> u(0,1);
for(size_t i = 0; i < 10; ++i)cout << u(e) << " ";
//空<>表示我们希望使用默认结果类型
uniform_real_distribution<> u(0,1); //默认生成double值
//生成非均匀分布的随机数
default_random_engine e; //生成随机整数
normal_distribution<> n(4, 1.5); //均值4,标准差1.5
vector<unsigned> vals(9); //9个元素均为0
for(size_t i = 0; i != 200; ++i){unsigned v = lround(n(e)); //舍入到最接近的整数if(v < vals.size()) //如果结果在范围内++vals[v]; //统计每个数出现了多少次
}
for(size_t j = 0; j != vals.size(); ++j)cout << j << ": " << string(vals[j],'*') << endl;
- 由于引擎返回相同的随机数序列,所以必须在循环外声明引擎对象。否则,每步循环都会创建一个新引擎,从而每步循环都会生成相同的值。类似的,分布对象也要保持状态,因此也应该在循环外定义。
string resp;
default_random_engine e; //e应保持状态,所以必须在循环外定义
bernoulli_distribution b; //默认是50/50的机会
do {bool first = b(e); //如果未true,则程序先行cout << (first ? "We go first" : "You get to go first") << endl;//传递谁先行的指示,进行游戏cout << ((play(first)) ? "sorry, you lost" : "congrats, you won") << endl;cout << "play again?Enter 'yes' or 'no'" << endl;
} while(cin >> resp&&resp[0] == 'y');
17.5 IO库再探
17.5.1 格式化输入与输出
- 操纵符(如endl)用于两大类输出控制:控制数值的输出形式以及控制补白的数量和位置。
- 当操纵符改变流的格式状态时,通常改变后的状态对所有后续IO都生效。
- 有些情况下,将流的状态置于一个非标准状态可能会导致错误。因此,通常最好在不再需要特殊格式时尽快将流恢复到默认状态。
- 操纵符boolalpha/noboolalpha控制布尔值的格式,使其输出true/false或1/0。
cout << "default bool values: " << true << " " << false<< "\nalpha bool values: " << boolalpha << true << " " << false << endl;
bool bool_val = false;
cout << bool_val << noboolalpha; // 恢复默认状态
cout << endl;
- 操纵符hex、oct和dec指定整型值的进制,但只影响整型运算对象,浮点值的表示形式不受影响。
cout << "default: " << 20 << " " << 1024 << endl;
cout << "octal: " << oct << 20 << " " << 1024 << endl;
cout << "hex: " << hex << 20 << " " << 1024 << endl;
cout << "decimal: " << dec << 20 << " " << 1024 << endl;
- 当对流应用showbase操纵符时,会在输出结果中显示进制,它遵循与整型常量中指定进制相同的规范。操纵符noshowbase恢复cout的状态,从而不再显示整型值的进制。
cout << showbase; // show the base when printing integral values
cout << "default: " << 20 << " " << 1024 << endl;
cout << "in octal: " << oct << 20 << " " << 1024 << endl;
cout << "in hex: " << hex << 20 << " " << 1024 << endl;
cout << "in decimal: " << dec << 20 << " " << 1024 << endl;
cout << noshowbase; // reset the state of the stream
cout << uppercase << showbase << hex<< "printed in hexadecimal: " << 20 << " " << 1024 << nouppercase << noshowbase << dec << endl;
- 通过调用IO对象的precision成员或使用setprecision操纵符来改变精度,其定义在头文件iomanip中。
//cout.precision返回当前精度值
cout << "Precision: "<< cout.precision() << ", Value: " << sqrt(2.0)<< endl;
//cout.precision(12)将打印精度设置为12位数字
cout.precision(12);
cout << "Precision: " << cout.precision() <<", Value: "<< sqrt(2.0) << endl;
//另一种设置精度的方法是使用setprecision操纵符
cout << setprecision(3);
cout << "Precision: " << cout.precision() << ", Value: " << sqrt(2.0)<< endl;
- 除非需要控制浮点数的表示形式(如按列打印数据或打印表示金额或百分比的数据,否则由标准库选择记数法是最好的方式。)
cout << "default format: " << 100 * sqrt(2.0) << '\n'<< "scientific: " << scientific << 100 * sqrt(2.0) << '\n'<< "fixed decimal: " << fixed << 100 * sqrt(2.0) << '\n'<< "hexadecimal: " << hexfloat << 100 * sqrt(2.0) << '\n'<< "use defaults: " << defaultfloat << 100 * sqrt(2.0) << "\n\n";cout << uppercase<< "scientific: " << scientific << sqrt(2.0) << '\n'<< "fixed decimal: " << fixed << sqrt(2.0) << '\n'<< "hexadecimal: " << hexfloat << sqrt(2.0) << "\n\n"<< nouppercase;
- C++11:使用hexfloat强制浮点数使用十六进制格式,使用defaultfloat将流恢复到默认状态——根据要打印的值选择记数法。
double pi = 3.14;
cout << pi << " " << hexfloat << pi << defaultfloat << " " << pi << endl;
- showpoint强制打印小数点,noshowpoint恢复默认行为。
- 输出补白:
setw:指定下一个数字或字符串值的最小空间。不改变输出流的内部状态,值决定下一个输出的大小。
left:左对齐输出。
right:右对齐输出。(默认格式)
internal:控制负数的符号的位置,它左对齐符号,右对齐值,用空格填满所有中间空间。
setfill:允许指定一个字符代替默认的空格来补白输出。
int i = -16;
double d = 3.14159;// pad the first column to use a minimum of 12 positions in the output
cout << "i: " << setw(12) << i << "next col" << '\n'<< "d: " << setw(12) << d << "next col" << '\n';// pad the first column and left-justify all columns
cout << left << "i: " << setw(12) << i << "next col" << '\n'<< "d: " << setw(12) << d << "next col" << '\n'<< right; // restore normal justification// pad the first column and right-justify all columns
cout << right<< "i: " << setw(12) << i << "next col" << '\n'<< "d: " << setw(12) << d << "next col" << '\n';// pad the first column but put the padding internal to the field
cout << internal<< "i: " << setw(12) << i << "next col" << '\n'<< "d: " << setw(12) << d << "next col" << '\n';// pad the first column, using # as the pad character
cout << setfill('#')<< "i: " << setw(12) << i << "next col" << '\n'<< "d: " << setw(12) << d << "next col" << '\n'<< setfill(' '); // restore the normal pad character
- noskipws会令输入运算符读取空白符,使用skipws恢复默认行为。
char ch;
cin >> noskipws; //设置cin读取空白符
while (cin >> ch)cout << ch;
cout << endl;
cin >> skipws; //将cin恢复到默认状态
17.5.2 未格式化的输入/输出操作
- 标准库提供了三种方法退回字符:
peek
unget
putback - 标准库不保证在中间不进行读取操作的情况下能连续调用putback或unget。
- 小心:低层函数容易出错。一般情况下,主张使用标准库提供的高层抽象。
17.5.3 流随机访问
- 随机IO本质上是依赖于系统的。为了理解如何使用这些特性,必须查询系统文档。
- 由于只有单一的标记,因此只要在读写操作间切换,就必须进行seek操作来重定位标记。
相关文章:

第十七章 标准库特殊设施
17.1 tuple类型 当希望将一些数据合成单一对象,但又不想麻烦地定义一个新数据结构来表示这些数据时,tuple非常有用。tuple是类似pair的模板。 tuple<size_t, size_t, size_t> threeD; //三个成员都设置为0//为每个成员提供初始值 tuple<strin…...
【格言分享】程序员的经典名言解读
上一期文章我们分享了一些程序员的经典名言,每一句都蕴含着深刻的道理。 接下来就给大家一个一个分析一下 这些格言确实捕捉到了编程和软件开发的精髓,每一条都蕴含着丰富的经验和智慧。下面我将逐一解释这些格言,并分享一些我的看法。 C程序员永远不会灭亡。他们只是cast…...
SpringBoot接收LocalDateTime参数
一、通过RequestBody接收 方式1:实体类上加上 JsonFormat,并通过 pattern 属性指定时间格式 public class Time {JsonFormat(pattern "yyyy-MM-dd HH:mm:ss")LocalDateTime localDateTime;JsonFormat(pattern "yyyy-MM-dd")Loca…...

Typora配置GitHub图床--结合PicGo
【当前问题】Typora文档分享时 无法看到本地路径图片 【怎么解决】把文档中的图片设置为 公开链接 【准备工具】 Typora 官网https://typoraio.cn/(购买 / 自寻破解法)GitHub账号 https://github.com/PicGo https://github.com/Molunerfinn/PicGo/relea…...

【书生.浦语实战营】——入门岛
【书生.浦语实战营】——入门岛_第一关_Linux基础 任务分布1. 本地vscode远程连接并进行端口映射端口映射What——何为端口映射How——怎么进行端口映射 2. Linux基础命令touch :创建文件mkdir :创建目录cd:进入 退出 目录pwd :确定当前所在目录cat:可以…...

WPF+MVVM案例实战(十四)- 封装一个自定义消息弹窗控件(下)
文章目录 1、案例效果2、弹窗控件使用1.引入用户控件2、按钮命令实现 3、总结4、源代码获取 1、案例效果 2、弹窗控件使用 1.引入用户控件 打开 Wpf_Examples 项目,在引用中添加用户控件库,在 MainWindow.xaml 界面引用控件库,代码如下&…...
嵌入式——STM32外设应用
STM32 微控制器以其高性能、低功耗和丰富的外设资源,在嵌入式系统设计中得到了广泛应用。以下将详细介绍 STM32 的主要外设及其典型应用,帮助开发者更好地理解和应用这些功能。 1. GPIO(通用输入输出端口) 功能:GPIO…...

HCIA(ACL)
第七节 ACL:访问控制列表 访问控制----在路由器的入或者出的接口上,匹配流量,之后产生动作---允许或拒绝 定义感兴趣流量-----帮助其他软件抓流量 匹配规则: 至上而下,逐一匹配,上调匹配按照上条执行…...

react基础之reactHooks
文章目录 React Hooks 使用指南常用 Hooks使用规则 小结 React Hooks 使用指南 React Hooks 是 React 16.8 引入的一种新特性,允许在函数组件中使用状态和其他 React 特性,而无需编写类组件。以下是一些基础的 Hooks 及其使用规则。 常用 Hooks useSta…...

Java基础0-Java概览
Java概览 一、Java的主要特性 Java 语言是简单的: Java 丢弃了 C 中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换。特别地,Java 语言不使用指针,而是引用。并提供了自动分配和回收内存…...

SW绘制曲面
20241031第一次学习 参考教程:SolidWorks视频教程SW实战营绘制一个布满球体的不规则曲面_哔哩哔哩_bilibili 过程概述: STEP 1:创建平面草图并拉伸 STEP 2:从侧面(拉伸出来的面)绘制样条曲线 样条曲线需要画到实例的底面(图中接下来是要向下变形)薄板两侧都要绘制...

css知识点梳理2
1. 选择器拓展 在 CSS 中,可以根据选择器的类型把选择器分为基础选择器和复合选择器,复合选择器是建立在基础选择器之上,对基本选择器进行组合形成的。 复合选择器是由两个或多个基础选择器,通过不同的方式组合而成的…...

攻防世界 MISC miao~详解
下载压缩包,但是尝试解压的时候提示错误,刚开始以为是伪加密之类的,但是尝试了一圈之后,发现并没有问题。后面用bandizip打开,得到了一张图片: 拖到010editor里面查看,没有发现什么 于是用随波逐…...

使用 `tracert [options] <目标地址>` 命令的详细介绍
使用 tracert [options] <目标地址> 命令的详细介绍 什么是 tracert 命令? tracert(Trace Route)是一个用于追踪数据包从一台计算机到达另一台计算机的网络工具。它通过发送特定的数据包,观察这些数据包经过的路由节点&…...
闲一品交易平台:SpringBoot技术的新境界
摘 要 随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,闲一品交易平台当然也不能排除在外。闲一品交易平台是以实际运用为开发背景,运用软件工程原理和开发方法&…...

【深入浅出】深入浅出transformer(附面试题)
本文的目的是为了帮助大家面试transformer,会结合我的面试经历以及看法去讲解transformer,并非完整的技术细致讲解,介意请移步。 结构 提到transformer网络模型,大家脑海中是否有这张图呢? 这是网络结构中经典的编解…...

苹果重大更新,macOS与iOS同时推出更新!功能真好用
前言 这几天,苹果更新了macOS和iOS的系统版本!macOS Sequoia 版本号15.1 iOS版本号18.1 小白更新设备系统的时间已经算比较晚的了,但好在更新得很及时!因为这次更新的功能很合小白的胃口啊!咱们先来看看本次更新了什么…...
刘艳兵-DBA016-在您的数据库中,SALES表存在于SH用户中,并且启用了统一审计。作为DBA,您成功执行了以下指令:
在您的数据库中,SALES表存在于SH用户中,并且启用了统一审计。作为DBA,您成功执行了以下指令: SQL> CREATE AUDIT POLICY sales_pol ACTIONS select on sh.sales; SQL> AUDIT POLICY sales_pol; 关于SALES_POL审计策略,哪个陈…...
力扣题目解析--整数反转
题目 给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。 假设环境不允许存储 64 位整数(有符号或无符号)。 示例 1:…...
净水前置需要安装吗?
业主问净水前置需不需要安装?是必须安装吗?这个问题其实很难回答,如果说非要安装,有可能客户会感觉我们在这上面要挣钱, 有很多业主没有安装家里用水也没有问题,如果说不需要安装,现在…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...

selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...