CH9 顺序容器
本章主要介绍了标准库顺序容器,包括
顺序容器的公共接口,如构造函数,添加/删除操作等
利用迭代器访问容器
不同顺序容器的差异
string的特殊操作
容器适配器,如栈,队列等
9.1
“按字典序插入到容器中”需要对数据进行排序,因此需要再容器中进行频繁的插入操作,vector和deque都是寻秩操作,vector在尾部以外的位置插入都很慢,deque在头尾以外位置插入很慢,而list在任意位置插入/删除都较快,所以(a)应使用list更合适。
(b)需要头尾插入/删除操作,list和dque都可以,但是需要频繁随机访问,deque更合适
(c)因为随机访问,也不需要头部进行插入/删除操作,vector更合适
9.2
list<deque<int>>idl;
9.3
它们指向同一个容器中的元素,或者是容器最后一个元素之后的位置,并且可以通过递增begin来达到end,即end不会出现在begin之前,但是编译器不会强制要求这些,程序员应确保这些约定。
9.4
#include <iostream>
#include <vector>
#include <iterator> using namespace std; bool find(vector<int>::iterator beg, vector<int>::iterator end, int ival)
{
for (; beg != end; beg++)
{
if (*beg == ival)
return true;
else
return false;
}
} int main()
{
vector<int>ivec={, , , , , , , , };
cout << find(ivec.begin(), ivec.end(), ) << endl;
cout << find(ivec.begin(), ivec.end(), ) << endl;
system("pause");
return ;
}
非常简单的一个查找功能,但是执行时返回的都是0,调试过程中第一个是true,第二个是false,没问题
9.5
只需将上题的函数返回类型修改
vector<int>::iterator find(vector<int>::iterator beg, vector<int>::iterator end, int ival)
{
for (; beg != end; beg++)
{
if (*beg == ival)
return beg;
else
return end;
}
}
9.6
list迭代器不支持<运算,只支持递增、递减、==以及!=运算。因为从数据结构的角度,deque和vector中的元素在内存中是连续的,因此可以实现迭代器大小,而list则是将元素以链表方式存储,两个指针的大小关系与它们指向的元素前后关系并一定吻合,实现<运算。
9.7
vector<int>::iterator
9.8
每个容器都定义了多个类型,如:size_type、iterator、const iterator通过类型别名,可以在不了解容器中元素的情况下使用它。如果需要元素类型,可以使用容器的value_type,如果需要元素类型的一个引用,可以使用reference或const reference。9.8答案如下
读取string的list中的元素: list<string>::value_type
写入list 使用list<string>::reference 元素的左值类型,与value_type&相同
9.9
以c开头的版本是C++新标准引入的,用以支持auto与begin和end函数结合使用的,,cbegin返回指向容器第一个元素的const迭代器,可以用来访问只读方式访问容器元素,不能对容器元素做修改。当不需要写访问时应用cbegin,begin与auto结合使用时获得的迭代器依赖于容器类型。有两个版本,一个const的一个非const的。
9.11
vector<int> iv1;//执行默认初始化,vector为空,即size为0,容器中没有元素,capacity为0,未分配存储空间
vector<int>iv2(iv1);//拷贝初始化,iv2为iv1的拷贝,要求iv2的类型与和元素数量必须与iv1相同
vector<int> iv3 = { ,,,, };//列表初始化,iv3初始化为列表中元素的拷贝
vector<int>iv4(iv3.begin() + , iv3.end());//iv4初始化为两个迭代器制定范围的元素的拷贝,元素类型必须相同,容器
//类型可以不同
vector<int>iv5();//默认初始化,iv5包含5个元素,每个元素的初始值执行默认值初始化
vector<int>iv6(, );//iv6初始化为6个6
9.12
上题注释部分有解释
list<int>与vector<double>容器类型不同,但int和double可以转换,可以使用迭代器范围实现拷贝。vector<int>可以直接用来拷贝初始化vector<double>。
9.14
将char* 转换为string,使用迭代器范围赋值拷贝
list<char*>cl = { "Hello","C++","primer" };
vector<string>svec;
svec.assign(cl.begin(), cl.end());
for (auto it : svec)
cout << it << " ";
cout << endl;
9.15
标准库容器支持关系运算
vector<int>ivec1 = { ,,,,, };
vector<int>ivec2 = { ,,,,, };
vector<int>ivec3 = { ,,,,, };
vector<int>ivec4 = { ,,,, };
cout << (ivec1 == ivec2) << endl;
cout << (ivec1 == ivec3) << endl;
cout << (ivec1 == ivec4) << endl;
ivec1.push_back();
for (auto it : ivec1)
cout << it << " ";
cout << endl;
ivec1.pop_back();
for (auto it : ivec1)
cout << it << " ";
cout << endl;
cout << (ivec1 == ivec2) << endl;
由执行结果看,两个vector的capacity不会影响相等性判断,我vec1的添加/删除操作导致vector扩容后仍与我vec2相等
9.16
比较一个list<int>中元素是否与一个vector<int>中的元素是否相等,首先应比较个数是否相等,若个数不等,则直接给出不等退出。若个数相等,再比较对应元素是否相等,需要遍历两个容器
#include <iostream>
#include <vector>
#include <list> using namespace std; bool equal(list<int>&il, vector<int>&iv)
{
if (il.size() != iv.size())
return false;
auto lbeg = il.cbegin();
auto vbeg = iv.cbegin();
auto lend = il.cend();
for (; lbeg != lend;lbeg++, vbeg++)
{
if (*lbeg != *vbeg)
return false;
else
return true;
} } int main()
{
list<int> il1 = { ,,,, };
list<int>il2 = { ,,,, };
vector<int>iv1 = { ,,, };
vector<int>iv2 = { ,,,, };
cout << equal(il1, iv1) << endl;
cout << equal(il1, iv2) << endl;
cout << equal(il2, iv2) << endl; system("pause");
return ;
}
9.18
string word;
deque<string>sd;
cout << "please enter the strings:" << endl;
while (cin >> word)
//sd.push_back(word);
sd.push_front(word);
for (auto it:sd)
cout << it << " ";
cout << endl;
容器是deque,使用push_front,首尾添加元素的性能比较好,但是,push_front添加元素的顺序与输出顺序是相反的,若想保持顺序相同,可以使用push_back。
9.19
与上一题并无太大差别,
9.20
可以延伸到按整除某个数的得到的余数,插入到deque中
#include <iostream>
#include <list>
#include <deque>
#include <vector> using namespace std; int main()
{
int num;
list<int>il;
deque<int>odd_deque;
deque<int>even_deque;
cout << "please input numbers:" << endl;
while (cin >> num)
il.push_back(num);
//9.20
/*for (auto it = il.begin(); it != il.end(); ++it)
{
if (*it % 2)
odd_deque.push_back(*it);
else
even_deque.push_back(*it);
}
cout << "奇数有:" << endl;
for (auto i : odd_deque)
cout << i << " ";
cout << endl;
cout << "偶数有:" << endl;
for (auto i : even_deque)
cout << i << " ";
cout << endl;*/ //9.20延伸,实现使用vector将被4整除的和余数分别为1,2,3数放在四个vector中
vector<int> iv0,iv1,iv2,iv3;
for (auto it = il.begin(); it != il.end(); ++it)
{
switch (*it%)
{
case :
iv0.push_back(*it);
break;
case :
iv1.push_back(*it);
break;
case :
iv2.push_back(*it);
break;
case :
iv3.push_back(*it);
break; }
}
cout << "被4整除的是:" << endl;
for (auto i : iv0)
cout << i << " ";
cout << endl;
cout << "余数为1的是;" << endl;
for (auto i : iv1)
cout << i << " ";
cout << endl;
cout << "余数为2的是;" << endl;
for (auto i : iv2)
cout << i << " ";
cout << endl;
cout << "余数为3的是;" << endl;
for (auto i : iv3)
cout << i << " ";
cout << endl;
system("pause");
return ; }
9.21
循环工作的过程和结果是一样的,只是list的首元素之前插入新元素的性能优于vector的,因为vector需要移动后面所有元素。
9.22
箱一个vector、string或deque插入元素会是现有指向容器的迭代器、引用和指针失效。
循环中没有对iter进行递增操作,iter不能向mid推进,其次,即使加入了iter++,由于使用了insert插入新元素,insert返回的是指向新元素的迭代器,原iter已失效,iter++也不能起到将迭代器向前推进一个位置的作用,修改如下:
应将insert返回的迭代器赋给iter,这样,iter始终指向新插入的元素,而insert是将新元素插入到原iter指向的元素的前一个元素,因此iter++应执行两次才是原来的iter指向的元素下一个元素。另外,insert会使mid失效,所以循环无法在正确位置结束,所以mid=iv.begin()+org_size/2+new_ele,其中,org_size=iv.size,iv未插入任何新元素之前,new_ele初始值为0,每插入一个元素,递增1。修改完整的如下:
#include <iostream>
#include <vector> using namespace std; int main()
{
vector<int>iv = { ,,, };
int some_value = ;
vector<int>::iterator iter = iv.begin();
int org_size = iv.size();
int new_ele = ;
while (iter != (iv.begin() + org_size + new_ele))
{
if (*iter == some_value)
{
iter = iv.insert(iter, * some_value);
new_ele++;
iter++;
iter++;
}
else
iter++;
} for (auto it : iv)
cout << it << " ";
cout << endl;
system("pause");
return ;
}
上面只是简单实现原程序想要实现的功能,vector中的元素可以从指定文件中读取,比较的元素可以由用户输入
9.23
四个值一样,都是vector中的唯一的元素
9.24
at和下标操作只适用于string、vector、deque和array
在容器中访问元素的成员函数(即,front、back、下标和at)返回的都是引用,如果容器是一个const对象,返回是是一个const引用。
9.24
使用前应先检查vector是否为空,若为空,使用at访问时会抛出一个out_of_range异常,程序不能捕获异常就会直接退出,后面三种不会抛出异常,而是直接退出。
#include <iostream>
#include <vector> using namespace std; int main()
{
vector<int> iv = { ,, };
if (iv.size() != )
{
cout << iv.at() << endl;
cout << iv[] << endl;
cout << iv.front() << endl;
cout << *(iv.begin()) << endl;
}
system("pause");
return ;
}
9.25
如果ele1和ele2相等,则容器保持不变,即使两个两个迭代器都指向尾后迭代器也是如此
9.26
#include <iostream>
#include <vector>
#include <list>
#include <iterator>
using namespace std; int main()
{
int ia[] = { ,,,,,,,,, };
vector<int>iv;
list<int>il;
//iv.assign(ia,ia.end());
iv.assign(ia, ia + );
il.assign(ia, ia+);
for (auto it : iv)
cout << it << " ";
cout << endl;
for (auto it : il)
cout << it << " ";
cout << endl; //vector<int>::iterator it1 =iv.begin();
/*for (auto it1 : iv)
{
if()
}*/
vector<int>::iterator it1 = iv.begin();
while (it1 != iv.end())
{
if (!(*it1%))
it1 = iv.erase(it1);
else
it1++;
}
list<int>::iterator it2 = il.begin();
while (it2 != il.end())
{
if (*it2 % )
it2 = il.erase(it2);
else
it2++; }
for (auto it : iv)
cout << it << " ";
cout << endl;
for (auto it : il)
cout << it << " ";
cout << endl; system("pause");
return ;
}
9.27
forward_list 是单向链表数据结构,只有前驱节点指向后继节点的指针,没有反向的指针,所以当删除一个元素后,应该调整前驱指针指向后继指针,从而删除当前元素。
#include <iostream>
#include <forward_list> using namespace std; int main()
{
int num;
forward_list<int> iflst;
cout << "please enter numbers:" << endl;
while (cin >> num)
iflst.push_front(num);//array ,forward_list不支持push_back //for (auto i : iflst)//由于每次进list都是在头部,所以输出与输入顺序相反
// cout << i << " ";
auto pre = iflst.before_begin();
auto curr = iflst.begin();
//for (auto it = curr; it != iflst.end(); ++it)
while(curr!=iflst.end())
{
if (*curr % )
{
curr=iflst.erase_after(pre);
}
else
{
//curr = pre;
pre =curr;
curr++;
} } for (auto i : iflst)
cout << i << " ";
cout << endl;
system("pause");
return ;
}
另外,输出的顺序与输入进list的元素顺序相反。
9.28
还是联系forward_list 的操作
#include <iostream>
#include <forward_list>
#include <string> using namespace std; void find_insert(forward_list<string>&sflst, const string& str1, const string& str2)
{
auto pre = sflst.before_begin();
auto curr = sflst.begin();
bool inserted = false;
while (curr != sflst.end())
{
if (*curr == str1)
{
curr = sflst.insert_after(curr, str2);//insert_after 返回的指向插入后元素的迭代器,也就是指向str2
inserted = true;
}
else
pre = curr;
curr++;
}
if (!inserted)
sflst.insert_after(pre, str2);//如果没有找到,此时pre指向sflst的最后一个元素,使用insert_after 插入到尾后
} int main()
{
forward_list<string> sflst = { "Hello","C++" };
find_insert(sflst, "C++", "primer");
for (auto it : sflst)
cout << it << " ";
cout << endl;
forward_list<string>sflst1 = { "Hello","Primer" };
find_insert(sflst1, "Hello", "C++");
for (auto it : sflst1)
cout << it << " ";
cout << endl; system("pause");
return ;
}
9.3.5 改变容器的大小
resizelai:增大或缩小容器,array不支持resize。c.resize(n):调整c的大小为n.
9.29
vec.resize();//会想vec末尾添加75个元素,并进行值初始化
vec.resize();//将vec末尾90个元素
9.30
因为调用单参数的resize,若是添加元素,会对新元素进行初始化,若元素是类类型,该类必须提供默认构造函数
9.3.6 容器操作可能使迭代器失效
由于想迭代器添加元素和从迭代器删除元素的代码可能会使迭代器失效,因此必须保证每次改变容器的操作之后懂正确的重新定位迭代器,尤其是vector、string和deque。
改变容器的循环程序:
//删除偶数元素,复制奇数元素
vector<int> iv = { ,,,,,,,,, };
auto iter = iv.begin();
while (iter != iv.end())
{
if (*iter % )
{
iter = iv.insert(iter, *iter);//复制当前元素,该语句在iter指向的元素之前添加一个*iterd 元素,
//返回指向该元素的迭代器,所以iter加2才能指向原来iter的下一个迭代器
iter += ;
}
else
iter = iv.erase(iter);//删除偶数元素,erase返回删除元素之后的元素的迭代器,不用再移动迭代器 }
不要保存end返回的迭代器
当向vector或string添加元素或从其删除元素,或在deque中首元素之外的任何位置添加/删除元素,原来end返回的迭代器总是失效。因此添加或删除的循环过程必须反复调用end,不能在循环之前保存end返回的迭代器9.31
9.31
list和forward_list与其他容器不同的是,迭代器不支持加减运算,因为链表中元素在内存中可能不是连续的,无法通过地址间加减偏移量实现,所以应该多次调用递增运算符实现加法操作
所以将上题第10行改为
iter++;
iter++;
就是list实现相同功能的代码,但是forward_list是单链表结构,删除元素时需要将当前的前驱指向当前节点的后继,需要维护“前驱”和“后继”两个迭代器
while循环如下
auto pre = iflst.before_begin();
auto curr = iflst.begin();
while (curr != iflst.end())
{
if (*curr % )
{
curr = iflst.insert_after(curr, *curr);
pre = curr;
curr++;
}
else
curr = iflst.erase_after(pre);
}
9.32
不合法。因为很多编译器对于实参求值、向形参传递的处理顺序是从右至左的。这样的hau话,insert语句就是先求值,再插入,那么插入的是当前奇数的下一个元素,insert的第一个参数的迭代器指向的位置是错误的,造成程序混乱,最终导致程序崩溃。
9.33
向vector添加元素后,原有迭代器会失效。所以,若不将insert的返回结果赋给begin,原有的又已失效,会造成程序混乱崩溃,对于此程序,保存end和不将insert的返回值赋给begin都会使程序崩溃
9.34
while循环没有花括号,那么++iter就是循环体外的语句了,不再是循环体内的最后一句,所以,容器只要不为空,程序就会进入死循环。
1.若第一个元素是奇数,if条件满足,复制当前奇数元素,并返回指向当前元素的迭代器,还是奇数,继续执行,一直循环下去
2.若第一个元素是偶数,if不会被执行,iter也不变,继续while,if仍然不被执行,iter任然不变,保持这种状态一直循环下去
9.35
容器的size是指容器中已保存的元素的数量,capacity是在容器没有重新分配内存时可以保存元素的数量。所以capacity>=size
9.37
list是链表,添加新元素时,会从内存分配一个新节点保存它,删除元素时,该节点占用的内存会被立即释放,所以,链表占用的内存空间与保存当前元素所需空间相等,array是大小固定的数组,定义时一次性分配内存,不可改变
9.38
#include <iostream>
#include <vector> using namespace std; int main()
{
vector<int>iv;
/*vector<int>::size_type s;
vector<int>::size_type c*/; //for ( s = iv.size, c = iv.capacity; s <= c; s++)
iv.push_back();
cout << "size: " << iv.size() << "," << "capacity: " << iv.capacity() << endl; /*for (s = iv.size, c = iv.capacity; s <= c; s++)*/
iv.push_back();
cout << "size: " << iv.size() << "," << "capacity: " << iv.capacity() << endl; //for (s = iv.size, c = iv.capacity; s <= c; s++)
iv.push_back();
cout << "size: " << iv.size() << "," << "capacity: " << iv.capacity() << endl; //for (s = iv.size, c = iv.capacity; s <= c; s++)
iv.push_back();
cout << "size: " << iv.size() << "," << "capacity: " << iv.capacity() << endl;
for (auto it : iv)
cout << it << " ";
cout << endl;
system("pause");
return ;
}
我的编译器capacity的增长是与size一样的,之前看到数据结构中有提到vector的capacity是成倍增长的
9.39
reserse为svec分配了可容纳1024个string的内存空间,接着向svec添加元素,如果string数量不大于1024,则capacity不变,否则按一定规则扩容,然后resize向svecd 末尾添加当前string数量一半的内存空间,并初始化为空字符串。如果capacity不足,则扩容。
9.40
跟编译器有关
9.41
vector提供了data函数,返回内存空间首地址。将此返回值作为string的构造函数的第一个参数,将vector的size返回值作为第二个参数,可以获取vector<char>中是数据。
vector<char> vc = { 'H','e','l','l','o' };
string str(vc.data(), vc.size());
cout << str << endl;
9.42
每次至少读取100个字符,可以使用reserve预先为string分配空间,然后逐个读取字符存入string
void read_string(string& str)
{
str.reserve();
char ch;
while (cin >> ch)
str.push_back(ch);
}
9.43
1.使用迭代器iter遍历s,如果s中剩余字符串长度小于oldVal的长度时,不需要再检查了,否则,继续检查
2.一旦出现相等的字符,需要利用循环检查后面的是否每一个字符与oldVal 中的相等。直到遍历完oldVal。否则便不是相等
3.一旦在s中找到oldVal,使用erase删除s中与oldVal相等的部分,然后使用循环和insert将newVal插入s中,并且由于insert是将要插入的元素插入到当前iter指向的位置之前,所以使用逆序插入。
#include <iostream>
#include <string> using namespace std; void replace(string &str, const string& str1, const string& str2)
{
auto len = str1.size();
if (!len)
return;
auto iter = str.begin();
while (iter<=str.end()-len) {
auto iter1 = iter;
auto iter2 = str1.begin();
while (iter2 != str1.end() && *iter1 == *iter2)
{
iter1++;
iter2++;
}
if (iter2 == str1.end())
{
iter = str.erase(iter, iter1);
if (str2.size())
{
iter2 = str2.end();
while (iter2 > str2.begin()) {
iter2--;
iter = str.insert(iter, *iter2); }
}
else
iter += str2.size();
}
else
iter++;
}
}
int main()
{
string s = "I have pass tho the line,have you pass tho it.";
string s1 = "tho";
string s2 = "through";
replace(s, s1, s2);
cout << s << endl;
system("pause");
return ;
}
9.44
使用stirng 的find()函数和replace()函数
void replace_fun(string& s, const string& oldVal, const string& newVal)
{
string::size_type np = ;//string 的find()函数,若查找成功,返回的是按查找规则找到的第一个字符的位置,
//若失败,返回的是npos,就是-1;
while ((np = s.find(oldVal, np)) != string::npos)
{
s.replace(np, oldVal.size(), newVal);
np += newVal.size();
}
}
string类提供了6个不同的搜索函数,每个函数都有4个重载版本,每个搜索操作都返回一个string::size_type值,表示匹配发生位置下标,如果搜索失败,则返回一个名为string::npos 的static成员。标准库将npos定义为一个const string::size_type类型,并初始化为-1.
9.45
#include <iostream>
#include <string> using namespace std; void appellation(string &name, string& pre, string& succ)
{
//name.insert(name.begin(), 1, " ");//vs2015不支持这种操作
name.insert(, " ");
//name.insert(name.begin(), pre.begin(), pre.end());
//还可以使用长度管理操作实现
name.insert(, pre);
//name.append(" ");
//长度管理实现
name.insert(name.size(), " "); //name.append(succ.begin(), succ.end());
//长度管理实现
name.insert(name.size(), succ); } int main()
{
string strName = "Willie Smith";
string pre = "Mr";
string succ = "II";
//appellation(strName, "Mr", "II");//如果是这样,则appellation函数后两个参数应该是const型
//appellation(string& ,const string&,const string&);
appellation(strName, pre, succ);
cout << strName << endl;
system("pause");
return ;
}
string的搜索操作
str.find_first_of(args);//在str中查找 args中任何一个字符串第一次出现的位置
str.find_first_not_of(args);//在str中查找第一个不在args中的字符
9.47
#include <iostream>
#include <string> using namespace std; //void find_char(string& str1, string& str2)
void find_char(string& str1,const string& str2)
{
cout << "在" << str1 << "中查找" << str2 << "中的字符" << endl;
string::size_type pos = ;
while ((pos = str1.find_first_of(str2, pos)) != string::npos)
{
cout << "pos: " << pos << " 的字符:" << str1[pos] << endl;
pos++;
}
}
//使用find_first_not_of实现
//main 函数中将find_char函数的调用调换位置
//查找数字时find_not_char(s1,"abcdefghijklmnopqrstuvwxyz""ABCDEFGHIJKLMNOPQRSTUVWXYZ");
//查找字母时find_not_char(s1,"0123456789"); int main()
{
string s1 = "a1b2c3d4e5f6";
//string s2 = "236";
cout << "查找s中的所有数字" << endl;
find_char(s1, "");
cout << endl << endl;;
cout << "查找所有字母" << endl;
find_char(s1, "abcdefghijklmnopqrstuvwxyz""ABCDEFGHIJKLMNOPQRSTUVWXYZ"); system("pause");
return ;
}
s.find(args) 查找s中args第一次出现的位置,即第一个与args匹配自妇产的位置。args是作为一个整体在s中出现,不是像s.find_first_of(),在s中查找args中任何一个字符串第一次出现的位置。所以对于该题返回npos
9.49
9.6 容器适配器
CH9 顺序容器的更多相关文章
- C++ 顺序容器基础知识总结
0.前言 本文简单地总结了STL的顺序容器的知识点.文中并不涉及具体的实现技巧,对于细节的东西也没有提及.一来不同的标准库有着不同的实现,二来关于具体实现<STL源码剖析>已经展示得全面细 ...
- c++ 顺序容器学习
所谓容器,就是一个装东西的盒子,在c++中,我们把装的东西叫做“元素” 而顺序容器,就是说这些东西是有顺序的,你装进去是什么顺序,它们在里面就是什么顺序. c++中的顺序容器一共有这么几种: vect ...
- C++ Primer 第九章 顺序容器
由于书籍上写的已经很经典了,故大部分用图片的形式来阐述概念,代码纯手打进行验证. 1.顺序容器类型:vector.deque.list.forword_list.array.string. 2.顺序容 ...
- C++学习基础四——顺序容器和关联容器
—顺序容器:vector,list,queue1.顺序容器的常见用法: #include <vector> #include <list> #include <queue ...
- C++ 顺序容器
<C++ Primer 4th>读书笔记 顺序容器内的元素按其位置存储和访问.容器类共享公共的接口,每种容器类型提供一组不同的时间和功能折衷方案.通常不需要修改代码,只需改变类型声明,用一 ...
- C++ Primer : 第九章 : 顺序容器的操作以及迭代器失效问题
顺序容器的添加.访问.删除操作以及forward_list的特殊操作,还有迭代器失效问题. 一.向容器添加元素 // array不支持这些操作 // forward_list有自己撰于的版本的inse ...
- C++ Primer : 第九章 : 顺序容器的定义、迭代器以及赋值与swap
顺序容器属于C++ STL的一部分,也是非常重要的一部分. 顺序容器包括: std::vector,包含在头文件<vector>中 std::string, 包含在头文件<strin ...
- 顺序容器:vector,deque,list
1.顺序容器:vector,deque,list 容器类共享公共接口,只要学会其中一种类型就能运用另一种类型.每种容器提供一组不同的时间和功能这种方案,通常不需要修改代码,秩序改变类型声明,每一种容器 ...
- C++ Primer 随笔 Chapter 9 顺序容器
参考:http://www.cnblogs.com/kurtwang/archive/2010/08/19/1802912.html 1..顺序容器:vector(快速随机访问):list(快速插入 ...
随机推荐
- 学好Linux必备知识
鸟哥的私房菜中提到学好Linux必备的几种技能: 1. 计算器概论不硬件相关知识: 因为既然想要走Linux这门路,信息相关癿基础技能也丌能没有啊! 所以先理觋一下基础癿硬件知识,丌用一定要全懂啦! ...
- 【原】python总结
python3浅拷贝和深拷贝:https://www.jianshu.com/p/c7e72fcad407
- Python读取MNIST数据集
MNIST数据集获取 MNIST数据集是入门机器学习/模式识别的最经典数据集之一.最早于1998年Yan Lecun在论文: Gradient-based learning applied to do ...
- 【PAT甲级】1054 The Dominant Color (20 分)
题意: 输入两个正整数M和N(M<=800,N<=600),分别代表一张图片的宽度和高度,接着输入N行每行包括M个点的颜色编号,输出这张图片主导色的编号.(一张图片的主导色占据了一半以上的 ...
- Web性能测试工具推荐
WEB性能测试工具主要分为三种: 一种是测试页面资源加载速度的: 一种是测试页面加载完毕后页面呈现.JS操作速度的: 一种是总体上对页面进行评价分析. ~~~如果谁有更好的工具也请一起分享下 1. ...
- Steam 游戏 《The Vagrant(流浪者)》修改器制作-[先使用CE写,之后有时间的话改用CheatMaker](2020年寒假小目标08)
日期:2020.02.07 博客期:146 星期五 [温馨提示]: 只是想要修改器的网友,可以直接点击此链接下载: 只是想拿CT文件的网友,可以直接点击此链接下载: 没有博客园账号的网友,可以将页面下 ...
- GO 空白标识符 _
空白标识符 _ 也被用于抛弃值,如值 5 在:_, b = 5, 7 中被抛弃. _ 实际上是一个只写变量,你不能得到它的值.这样做是因为 Go 语言中你必须使用所有被声明的变量,但有时你并不需要使用 ...
- openstack搭建之旅(原创)
1.什么是openstack是一个集中管理虚拟机的平台,整合了各种虚拟化的技术.虚拟机的具体创建交给具体的虚拟化技术实现,而Openstack是整合这些虚拟化技术,提供一个统一管理的视图,对虚拟机进行 ...
- 小程序云开发使用where查询遇到的问题
想用小程序云开发的where查询,结果不论输入什么都是不报错,开始没注意,后来发现输入数据库中有的数据时,给打印出来查询成功,输入数据库中没有的数据时,也会得到一个集合,只不过这个集合的长度为0而已. ...
- Netsparker介绍
Netsparker是一款综合型的web应用安全漏洞扫描工具,它分为专业版和免费版,免费版的功能也比较强大.Netsparker与其他综合性的web应用安全扫描工具相比的一个特点是它能够更好的检测SQ ...