vector::iterator
list::value_type
list::reference
list<string> ls = {"1","2","3"};
vector<const char *> vs = {"4","5","6"};
list<string> list2(vs.begin(),vs.end());
只有当其元素类型也定义了相应的比较运算符时,我们才可以使用关系运算符来比较两个容器
向一个vector,string,deque插入元素会使现有指向容器的迭代器,引用,指针生效.这时就应该结合insert返回的元素来进行操作
while(!ilist.empty()){
}
slist.clear()
slist.erase(slist.begin(),slist.end())
int main()
{
int a[] = {0,1,1,2,3,5,8,13,21,55,89};
vector<int> vi ;
list<int> li;
vi.assign(a,a+11); // 将数组上的元素拷贝到vector中
li.assign(a,a+11);
vector<int>::iterator vit = vi.begin();
while (vit != vi.end()){
if(*vit %2 == 0){
vit = vi.erase(vit);
} else{
vit++;
}
}
vit = vi.begin();
while (vit != vi.end()){
cout<<*vit<<ends;
vit++;
}
return 0;
}
int main() {
int a[] = {0, 1, 1, 2, 3, 5, 8, 13, 21, 55, 89};
forward_list<int> fi;
fi.assign(a, a + 11); // 将数组上的元素拷贝到forward_list中
int x1 = 21, x2 = 2; //查找x1并将x2插入到紧挨x1之后的位置
forward_list<int>::iterator it = fi.before_begin();//返回第一个元素前面的迭代器
forward_list<int>::iterator nestIt = fi.begin();//返回首元素
it = fi.begin();
while (it != fi.end()) {
cout << *it << ends;
it++;
}
it = fi.before_begin();
cout<<endl;
//查找x1
while (nestIt != fi.end()) {
if (*nestIt == x1) {
fi.erase_after(it); //删除it之后的元素,it在nextIt的前面
break;
} else {
it++;
nestIt++;
}
}
it = fi.begin();
while (it != fi.end()) {
cout << *it << ends;
it++;
}
nestIt = fi.begin();
//插入x1到x2的位置
while (nestIt != fi.end()) {
if (*nestIt == x2) {
fi.insert_after(nestIt, x1);
break;
} else {
nestIt++;
}
}
cout << endl;
it = fi.begin();
//插入x1到x2的位置
while (it != fi.end()) {
cout << *it << ends;
it++;
}
/*
* 0 1 1 2 3 5 8 13 21 55 89
0 1 1 2 3 5 8 13 55 89
0 1 1 2 21 3 5 8 13 55 89
*/
return 0;
}
容器扩容
,即容器的存储空间重新分配,则指向容器的迭代器失效
未扩容
,则指向插入位置之前
的元素的迭代器有效
,但指向插入位置之后
元素的迭代器将会失效
,这是因为插入位置后的元素次序发生变化使得原本指向某元素的迭代器不再指向希望指向的元素。前
插入新元素,然后返回指向新元素的迭代器,所以必须加两次,越过插入的新元素和正在处理的元素
如果在一个循环中插入,删除deque或vector中的元素,不要缓存end返回的迭代器’
第一题:
list和forward_list支持
++不支持
+=` vector<int> vi = {0,1,2,3,4,5,6,7,8,9};
auto iter = vi.begin();
while(iter != vi.end())
{
if(*iter % 2)
{
iter = vi.insert(iter,*iter);
iter+=2;
cout<<1<<endl;
}
else
{
iter = vi.erase(iter); //删除之后返回我们删除的元素之后的元素
}
}
int main() {
list<int> vi = {0,1,2,3,4,5,6,7,8,9};
auto iter = vi.begin();
while(iter != vi.end())
{
if(*iter % 2) //奇数
{
iter = vi.insert(iter,*iter);
iter++;
iter++;
}
else
{
iter = vi.erase(iter); //删除之后返回我们删除的元素之后的元素
}
}
iter = vi.begin();
while (iter != vi.end()){
cout<<*iter<<ends;
iter++;
}
return 0;
}
/删除奇数,复制偶数
int main() {
//对于forward_list删除元素时,由于是单链表结构,需要维护前驱和后继两个迭代器
forward_list<int> vi = {0,1,2,3,4,5,6,7,8,9};
auto iter = vi.begin();
auto prev = vi.before_begin();
while(iter != vi.end())
{
if(*iter % 2) //奇数
{
iter = vi.insert_after(iter,*iter); //返回插入的元素
prev = iter;
iter++;
}
else
{
iter = vi.erase_after(prev); //删除之后返回我们删除的元素之后的元素
}
}
iter = vi.begin();
while (iter != vi.end()){
cout<<*iter<<ends;
iter++;
}
return 0;
}
第二题
void test(string &s, string& oldVal, string& newVal)
{
if (!s.size())
return; //s为空
string::iterator its = s.begin();
int j = 0; //记录正在遍历的s的位置
while (its != s.end()) {
if (*its == oldVal[0] && j < s.size())
{
cout << "找到首元素" << endl;
string::iterator oldIt = oldVal.begin();
while (oldIt !=oldVal.end() && *its == *oldIt && j< s.size())
{
oldIt++;
its++;
}
if (oldIt == oldVal.end())
{ //s中有oldval并找到其位置
cout << "找到了" << endl;
s.erase(j,oldVal.size());
s.insert(j, newVal);
break;
}
}
else
{
its++;
j++;
}
}
}
int main(int argc, char** argv)
{
string s = "newtho";
string old = "tho";
string news = "news";
test(s, old, news);
cout << s << endl; //newsnew
return 0;
}
在字符串中循环的搜索字符串出现的所有位置
void test(string &s, string& findStr)
{
string::size_type pos = 0;
while ((pos = s.find_first_of(findStr,pos)) != string::npos)
{
cout << "pos = " << pos<<"Element is " << s[pos]<< endl;
++pos;
}
}
s.find_first_of(str)
查找的是str中的任意一个字符在s首次出现的位置
rfind
for-each语句遍历string会乱码
string::size_type pos = 0;
string str = "qwertyuiopasdfghjklzxcvbnm";
string::size_type len = str.size();
for(int i =0;i< len;i++)
{
str += toupper(str[i]);
cout << str[i] << " " << toupper(str[i]) << " " << str << endl;
}
cout << str << endl;