select
distinct column1[, column2...]
from
tables
[where conditions];
distinct
来返回不重复字段的条数(count(distinct column)
),因为distinct
只能返回它的目标字段,而无法返回其他字段distinct
要放在所有字段的前面;如果去重的字段大于一个,则会进行组合去重,只有多个字段组合起来相同时才会被去重order by column1[, column2...] ASC|DESC
select city ,count(*) as num from staff group by city;
alter table staff add index idx_age_city(age,city);
and condition
explain expression
#define showArgs(...) puts(#__VA_ARGS__)
showArgs( one\n, "2\n", three );
puts("one\n, \"2\\n\", three");
#define TEXT_A "Hello, world!"
#define msg(x) puts( TEXT_ ## x )
msg(A);
typedef
declarations use the same syntax as ordinary variable declarations. The difference is that instead of declaring “a variable named x of type y”, you declare “a type named x that is a synonym for type y”. The syntax is otherwise the same.–color[=always/never/auto:表示对匹配到的文本着色显示
-i:在搜索的时候忽略大小写 –ignore-case
-n:显示结果所在行号 –line-number
-c:统计匹配到的行数,注意,是匹配到的总行数,不是匹配到的次数 –count
-o:只显示符合条件的字符串,但是不整行显示,每个符合条件的字符串单独显示一行 –only-matching
-v:输出不带关键字的行(反向查询,反向匹配) –invert-match
-w:匹配整个单词,如果是字符串中包含这个单词,则不作匹配 –word-regexp
-A<N>:在输出的时候包含结果所在行之后的指定行数,这里指之后的N行 –after-context=N
-B<N>:在输出的时候包含结果所在行之前的指定行数,这里指之前的N行 –before-context=N
-C<N>:在输出的时候包含结果所在行之前和之后的指定行数,这里指之前和之后的N行 –context=N
-e:实现多个选项的匹配,逻辑or关系 –regexp=PATTERN
-q:静默模式,不输出任何信息,当我们只关心有没有匹配到,却不关心匹配到什么内容时,我们可以使用此命令,然后,使用”echo $?”查看是否匹配到,0表示匹配到,1表示没有匹配到 –quiet
-P:表示使用兼容perl的正则引擎
-E/egrep:使用扩展正则表达式,而不是基本正则表达式 –extended-regexp
-F/fgrep:不支持正则表达式,只能匹配写死的字符串,但是速度奇快,效率高 –fixed-strings
|
表示管道,上一条命令的输出,作为下一条命令参数(输入)。因此可以用|
分隔多个grep实现与
的功能
使用cut -b
来提取需要的字节(在UTF-8字符集下,一个中文字符占用3个字节,一个英文字符占用1个字节)
使用uniq
检查及删除文本文件中重复出现的行,使用-c
来输出总数量
使用sort
来对结果进行排序,[-t<分隔字符>]
来指定分隔字符,[-k field1[, field2]]
指定用于排序的列
使用wc [-clw] <file>
来统计文件的字节数/行数/单词数
参考链接:【LeetCode - 340】至多包含 K 个不同字符的最长子串
int main()
{
std::string s{ "ecebabb" };
int k = 2;
std::map<char, std::set<int>> contain;
std::string result;
int begin = 0;
int end = 1;
while (begin < s.size() && end <= s.size())
{
if (contain.find(s.at(end - 1)) == contain.end() && contain.size() == k)
{
contain.at(s.at(begin)).erase(begin);
if (contain.at(s.at(begin)).size() == 0)
{
contain.erase(s.at(begin));
}
++begin;
}
else
{
if (contain.find(s.at(end - 1)) == contain.end())
{
contain.emplace(s.at(end - 1), std::set<int>{end - 1});
}
else
{
contain[s.at(end - 1)].insert(end - 1);
}
if (contain.size() == k && end - begin > result.size())
{
result = s.substr(begin, end - begin);
}
++end;
}
}
return 0;
}
可以使用计算机进行元操作的情况,无需寻找宏观规律。计算机就是擅长解决重复性的简单任务。
e.g. compile error
const T *p;
T *q = p;
void function(T); void function(const T);
void function(T*); void function(T* const);
void function(T*); void function(const T*);
void function(T&); void function(const T&);
e.g.
#include <iostream>
using namespace std;
class A {
string a;
public:
A(string _a) :a(_a) {};
const char& operator[](size_t position) const
{
cout << "const function" << endl;
return a[position];
}
char& operator[](size_t position)
{
cout << "modifiable function" << endl;
return const_cast<char&>(static_cast<const A&>(*this)[position]);
}
};
int main()
{
A s("test string");
cout << s[2] << endl;
const A s2("test string");
cout << s2[2] << endl;
return 0;
}
output:
modifiable function
const function
s
const function
s
非const对象的this的类型类似于T* const,即所谓的“顶层”const。因此可以调用const和非const函数(可以隐式转换为const T* const); 而const对象的this类型const T* const无法隐式转换为T* const,所以无法调用非const函数;