(a)list更合适,因为按照字典序插入到容器中代表需要在容器中间插入元素
(b)deque更合适,因为deque支持双端插入和删除
(c)无具体的插入删除操作,读取整数数量也是未知,可以选择vector
int main(int argc, char* argv[]) { std::list<std::deque<int>> lq; }
指向同一个容器的元素,或者尾后迭代器
end不在begin之前
bool find(vector<int>::const_iterator& begin, vector<int>::const_iterator& end, int i) { while (begin != end) { if (*begin == i)return true; } return false; }
vector<int>::const_iterator& find(vector<int>::const_iterator& begin, vector<int>::const_iterator& end, int i) { while (begin != end) { if (*begin == i)return begin; } std::cerr << "don‘t find the num in the arrange"; return end; }
在C++定义的容器类型中,只有vector和queue容器提供迭代器算数运算和除!=和==之外的关系运算
vector<int>::size_type
读取
list<string>::iterator||list<string>::const_iterator
写入
list<string>::iterator
cbegin返回的是const迭代器对象,begin不是
it1:vector<int>::iterator
it2:const vector<int>::iteratorit3:vector<int>::const_iterator
it4:const vector<int>::const_iterator
vector<int> v1;//空 vector<int> v2(v1);//v1的拷贝 vector<int> v3{ 0,1,2,3 };//初始化为初始化列表的拷贝 vector<int> v4(v3.begin(), v3.end());//初始化为迭代器之间元素的拷贝 vector<int> v5(10);//包含10个元素,每一个都被值初始化为0 vector<int> v6(10, 5);//包含10个元素,每个都初始化为5
接受一个容器创建其拷贝的构造函数:要求具有相同的容器类型,保存的是相同的元素类型
接受两个迭代器创建拷贝的构造函数:只要求迭代器范围内的元素类型相同
int main(int argc, char* argv[]) { list<int> li{ 0,1,2,3 }; vector<double> vd(li.begin(), li.end()); for (auto i : vd) cout << i << " "; cout << endl; vector<int> vi{ 0,1,2,3 }; vector<double> vd2(vi.begin(), vi.end()); for (auto i : vd2) cout << i << " "; }
int main(int argc, char* argv[]) { list<const char*> lc; vector<string> vs; vs.assign(lc.begin(), lc.end()); }
template<typename T> bool check(const vector<T>& v1, const vector<T>& v2) { return v1 == v2; } int main(int argc, char* argv[]) { vector<string> vs1{ "012" }; vector<string> vs2{ "012","123" }; cout << (check(vs1, vs2) ? "相等" : "不相等"); }
template<typename T> bool check(const list<T>& v1, const vector<T>& v2) { if (v1.size() == v2.size()) { auto j = v2.begin(); for (auto i = v1.begin(); i !=v1.end() ; i++,j++) { if (*i != *j)return false; } return true; } return false; } int main(int argc, char* argv[]) { list<string> vs1{ "012" }; vector<string> vs2{ "012","123" }; cout << (check(vs1, vs2) ? "相等" : "不相等"); }
要求不是无序关联容器,c1和c2必须是相同类型的容器,且必须保存相同类型的元素
int main(int argc, char* argv[]) { std::deque<string> ds; string s; while (cin >> s) { ds.emplace_back(s); s.clear(); } for (auto it = ds.begin(); it != ds.end(); it++) { cout << *it << endl; } }
int main(int argc, char* argv[]) { list<string> ls; string s; while (cin >> s) { ls.emplace_back(s); s.clear(); } for (auto it = ls.begin(); it != ls.end(); it++) { cout << *it << endl; } }
int main(int argc, char* argv[]) { list<int> li; int i; deque<int> di1, di2; while (cin >> i) { li.emplace_back(i); } for (auto it = li.begin(); it != li.end(); it++) { if ((*it) % 2)di1.emplace_back(*it); else di2.emplace_back(*it); } }
int main(int argc, char* argv[]) { vector<string> vst; string word; auto iter = vst.begin(); while (cin >> word) { iter = vst.insert(iter, word); } }
将iter初始化为vst.begin(),第一次调用insert会将我们刚刚读入的string插入到iter所指向的元素之前的位置。
int main(int argc, char* argv[]) { vector<int> iv{ 0,1,2,3,4,5 }; vector<int>::iterator iter = iv.begin(), mid = iv.begin() + iv.size() / 2; int some_val = 0; while (iter!=mid) { if (*iter == some_val) iv.insert(iter, 2 * some_val); } }
该程序会在满足程序的情况下在vector开头插入元素,导致迭代器失效,应更新循环中的迭代器,并保证迭代器不会陷入无限循环
int main(int argc, char* argv[]) { vector<int> iv{ 0,1,2,3,4,5 }; vector<int>::iterator iter = iv.begin(), mid = iv.begin() + iv.size() / 2; int some_val = 0; while (iter!=mid) { if (*iter == some_val) { iter = iv.insert(iter, 2 * some_val); iter += 2; } else iter++; mid = iv.begin() + iv.size() / 2; } }
val,val2,val3和val4的值都相同
at:有未经处理的异常: Microsoft C++ 异常: std::out_of_range
下标运算符:vector subscript out of range
front:front() called on empty vector
begin:cant‘t dereference value-initialized vector iterator
elem1与elem2相等不会删除容器元素,如果elem2时尾后迭代器会删除所有elem1到elem2的所有元素(不包括elem2),如果elem1和elem2皆为尾后迭代器则不会删除元素
int main(int argc, char* argv[]) { int ia[] = { 0 ,1,1,2,3,5,8,13,21,55,89 }; vector<int> iv; iv.assign(ia, ia + sizeof(ia) / sizeof(int)); auto it = iv.begin(); while (it!=iv.end()) { if (!(*it % 2)) it = iv.erase(it); else it++; } list<int> il; il.assign(ia, ia + sizeof(ia) / sizeof(int)); auto it2 = il.begin(); while (it2 != il.end()) { if (*it2 % 2) it2 = il.erase(it2); else it2++; } }
int main(int argc, char* argv[]) { forward_list<int> flst = { 0,1,2,3,4,5,6,7,8,9 }; auto prev = flst.before_begin(), curr = flst.begin(); while (curr != flst.end()) { if (*curr % 2) { curr = flst.erase_after(prev); } else { prev = curr; curr++; } } }
void fl_find_insert(forward_list<string>& flst, string& s1, string& s2) { auto prev = flst.before_begin(), curr = flst.begin(); while (curr != flst.end()) { if (*curr == s1) { flst.insert_after(prev, s2); return; } else { prev = curr; ++curr; } } flst.insert_after(prev, s2); }
vec.resize(100):调整vec大小为100,由于vec原来包含25个元素,将75个值为0的元素添加到vec末尾
vec.resize(10):调整vec大小为10,由于vec原来包含25个元素,将vec末尾15个元素删除
元素必须能进行值初始化,若为类类型元素则必须提供默认值或者默认构造函数
list迭代器没有递增递减的操作,需要修改为advance(iter, 2);
forward_list没有insert和erase操作需要修改
不合法,++递增符改变了iter的值,将产生未定义的行为。因为赋值运算符左右两端的运算对象都用到了iter,并且右侧的运算对象还改变了iter的值
迭代器失效
遍历容器,查找所有为奇数的元素并复制该元素插入到容器中,但因为只递增了一次导致程序只会卡在第一次找到奇数的时候
容器的size是指它已经保存的元素的数目
容器的capacity是在不分配新的内存空间的前提下他最多能保存多少元素
不可能,因为size必然小于等于capacity
list没有capacity是因为不要求空间是连续的
array没有capacity是因为array不允许修改空间大小
int main(int argc, char* argv[]) { vector<int> vec1; int a; while (cin >> a) { vec1.push_back(a); cout << "vector的大小" << vec1.size() << endl;; cout << "vector的容量" << vec1.capacity() << endl; } }
为vector分配1024个string元素的内存,传入值,然后插入容器一半数量的空string元素
256:1024
512:1024
1000:1536
1024:2304
int main(int argc, char* argv[]) { vector<char>cvec(10, ‘c‘); char *charray=new char[cvec.size()]; memcpy(charray, &cvec[0], cvec.size() * sizeof(char)); string s(charray); }
int main(int argc, char* argv[]) { string s; s.reserve(100); char c; while (cin >> c) { s.push_back(c); } }
void str_find_replace(string& s, string& oldVal, string& newVal) { auto it1 = s.begin(), it2 = newVal.begin(), it3 = newVal.end(); for (; it1 != s.end() - oldVal.size(); it1++) { if (s.substr(it1 - s.begin(), oldVal.size()) == oldVal) { s.erase(it1 - s.begin(), oldVal.size()); it1 = s.insert(it1, newVal.begin(), newVal.end()); it1 += newVal.size(); } } }
void str_find_replace(string& s, string& oldVal, string& newVal) { auto it1 = s.begin(), it2 = newVal.begin(), it3 = newVal.end(); for (; it1 != s.end() - oldVal.size(); it1++) { if (s.substr(it1 - s.begin(), oldVal.size()) == oldVal) { s.replace(it1, it1 + oldVal.size(), newVal); it1 += newVal.size(); } } }
void str_find_add(string& s, string& prev, string& last) { s.insert(0, prev); s.append(last); }
void str_find_add(string& s, string& prev, string& last) { s.insert(0, prev); s.insert(s.size(), last); }
只用find_first_of的
int main(int argc, char* argv[]) { string s = "ab2c3d7R4E6"; string numbers("0123456789"); auto pos = 0; while ((pos = s.find_first_of(numbers, pos)) != string::npos) { cout << s[pos++]; } auto pos1 = 0, pos2 = 0; while ((pos2 = s.find_first_of(numbers, pos1)) != string::npos) { for (; pos1 != pos2; ++pos1) cout << s[pos1]; ++pos1; } if (pos1 != s.find_last_not_of(numbers))cout << s[pos1]; return 0; }
只用find_first_not_of的
int main(int argc, char* argv[]) { string s = "ab2c3d7R4E6"; string numbers("0123456789"); auto pos1 = 0, pos2 = 0; while ((pos2 = s.find_first_not_of(numbers, pos1)) != string::npos) { for (; pos1 != pos2; ++pos1) cout << s[pos1]; ++pos1; } if (pos1 != s.find_last_not_of(numbers))cout << s[pos1]; auto pos = 0; while ((pos = s.find_first_not_of(numbers, pos)) != string::npos){ cout << s[pos++]; } return 0; }
string::npos
原文:https://www.cnblogs.com/GodZhuan/p/13935100.html