forward_list是单向链表容器,每个元素一个节点
#include
#include
using namespace std;
int main()
{
forward_list<int> fl;
cout << "fl的size为:" << distance(fl.begin(), fl.end()) << endl;
fl.push_front(2); //前面插入元素
//fl.pop_front(); //后面删除元素 //使用这个一定要确保容器不为空
fl.push_front(6);
//fl.pop_front();
cout << "fl的size为:" << distance(fl.begin(), fl.end()) << endl;
cout << "fl的max_size为:" << fl.max_size() << endl << endl;
cout << "1容器的元素为:" << endl;
for(auto value : fl ){
cout << value << " ";
}
cout << endl << endl;
cout << "fl的最前面元素是:" << fl.front() << endl << endl;
fl.resize(5, 66);
cout << "2容器的元素为:" << endl;
for(auto value : fl ){
cout << value << " ";
}
cout << endl;
return 0;
}
代码的话就写这么多,其他用法如下
forward_list fl(10);这样初始化,代表10个元素为默认值
forward_list fl(10, 666);这样初始化,代表10个元素都为666
forward_list fl(fl_);拷贝链表数据
front();第一个元素
empty()判断容器是否为空的方法
emplace_back()和emplace_front();这两个方法和push_back差不多,但是这个方法可以避免不必要的拷贝和移动
swap();交换两个容器的元素 //fl.swap(fl_);
assign(n, value);使用n个value代替旧有元素
auto it = find(fl.begin(), fl.end(), value);可以寻找元素是否存在,(distance(fl.begin(), it))返回fl.begin()到it的距离
merge(fl_);当前链表和另一个已排序的链表合并为一个排序后的链表。 fl_容器变空链表。fl.merge(fl_);
unique();删除链表中相邻的重复元素,只保留一个 fl.unique();
splice_after(iterator pos, fl_); 将fl_链表的所有元素转移到当前链表位置 fl.splice_after(it, fl_); fl_容器变空链表
splice_after用法二:splice_after(iterator pos, fl_, iterator value); fl.splice_after(it, fl_, fl_.begin());
remove(value);删除链表中所有值为value的元素; fl.remove(value);
replace(iterator begin, iterator end, old_value, new_value);将链表中所有等于old_value的元素替换为new_value ,比如这样replace(fl.begin(), fl.end(), 2, 20);
count(); count(fl.begin(), fl.end(), value);
sort(); fl.sort(); //使用自己的sort()方法,不能使用std::sort()
insert_after(iterator pos, value)
insert_after(iterator pos, n, value)
insert_after(iterator pos, iterator first, iterator last)
erase_after(iterator pos)
erase_after(iterator first, iterator last)
remove_if(); fl.remove_if(谓词);
reverse(); fl.reverse();
partition()容器里符合条件的移到前面,不保持相对顺序
代码如下:
#include
#include
#include
#include
using namespace std;
const bool PRINT = true;
const int TESTVALUE = 111;
bool RemoveIf(int x){
return x % 2 == 0;
}
bool isEven(int x){
return x % 2 == 0;
}
int main()
{
//forward_list fl(10);这样初始化,代表10个元素为默认值
if (PRINT || TESTVALUE == 1) {
cout << "TESTVALUE = 1" << endl;
forward_list<int> fl(10);
for (auto value : fl) {
cout << value << "\t";
}
cout << endl << endl;
}
//forward_list fl(10, 666);这样初始化,代表10个元素都为666
if (PRINT || TESTVALUE == 2) {
cout << "TESTVALUE = 2" << endl;
forward_list<int> fl(10, 666);
for (auto value : fl) {
cout << value << "\t";
}
cout << endl << endl;
}
//forward_list fl(fl_);拷贝链表数据
if (PRINT || TESTVALUE == 3) {
cout << "TESTVALUE = 3" << endl;
forward_list<int> fl_(10, 66);
forward_list<int> fl(fl_);
for (auto value : fl) {
cout << value << "\t";
}
cout << endl << endl;
}
//front();第一个元素
//链表为空的话使用front()出现未定义的行为,所以用之前需要使用empty()判断一下
if (PRINT || TESTVALUE == 4) {
cout << "TESTVALUE = 4" << endl;
forward_list<int> fl = { 3, 6, 9 };
cout << "fl的front元素为:" << fl.front() << endl << endl;
}
//empty()判断容器是否为空的方法
if (PRINT || TESTVALUE == 5) {
cout << "TESTVALUE = 5" << endl;
forward_list<int> fl;
if (fl.empty()) {
cout << "fl容器为空" << endl;
}
else {
cout << "fl容器不为空" << endl;
}
cout << endl;
}
//emplace_front();这个方法和push_front差不多,但是这个方法可以避免不必要的拷贝和移动
if (PRINT || TESTVALUE == 6) {
cout << "TESTVALUE = 6" << endl;
forward_list<string> fl;
string str_1 = "hello";
fl.push_front(str_1); //这里发生了一次拷贝
fl.push_front("world"); //这里发生了一次移动
fl.emplace_front("hello, world!"); //这里是直接在容器里构造
for (auto value : fl)
cout << value << "\t";
cout << endl << endl;
}
//swap();交换两个容器的元素 //fl.swap(fl_);
if (PRINT || TESTVALUE == 8) {
cout << "TESTVALUE = 8" << endl;
forward_list<int> fl_ = { 2, 5, 8 };
forward_list<int> fl = { 1, 11, 111 };
fl.swap(fl_);
for (auto value : fl)
cout << value << "\t";
cout << endl << endl;
}
//assign(n, value);使用n个value代替旧有元素
if (PRINT || TESTVALUE == 9) {
cout << "TESTVALUE = 9" << endl;
forward_list<int> fl = { 1, 11, 111 };
fl.assign(3, 666);
for (auto value : fl)
cout << value << "\t";
cout << endl << endl;
}
//auto it = find(fl.begin(), fl.end(), value);可以寻找元素是否存在,(distance(fl.begin(), it))返回fl.begin()到it的距离
if (PRINT || TESTVALUE == 10) {
cout << "TESTVALUE = 10" << endl;
forward_list<int> fl = { 1, 11, 111 };
auto it = find(fl.begin(), fl.end(), 111);
cout << distance(fl.begin(), it) << endl << endl;
}
// merge(fl_);当前链表和另一个已排序的链表合并为一个排序后的链表。 ll容器变空链表. fl.merge(fl_);
if (PRINT || TESTVALUE == 11) {
cout << "TESTVALUE = 11" << endl;
forward_list<int> fl_ = { 1, 11, 111 };
forward_list<int> fl = { 2, 5, 8 };
fl.merge(fl_);
for (auto value : fl)
cout << value << "\t";
cout << endl << endl;
for (auto value : fl_)
cout << value << "\t";
cout << endl << endl;
}
//unique();删除链表中相邻的重复元素,只保留一个 fl.unique();
if (PRINT || TESTVALUE == 12) {
cout << "TESTVALUE = 12" << endl;
forward_list<int> fl = { 1, 11, 11, 11, 111 };
fl.unique();
for (auto value : fl)
cout << value << "\t";
cout << endl << endl;
}
//splice_after(iterator pos, fl_);将fl_链表的所有元素转移到当前链表位置 fl.splice_after(it, fl_); fl_容器变空链表
//splice_after用法二:splice_after(iterator pos, fl_, iterator value); fl.splice_after(it, fl_, fl_.begin());
if (PRINT || TESTVALUE == 13) {
cout << "TESTVALUE = 13" << endl;
forward_list<int> fl_ = { 2,5, 8 };
forward_list<int> fl = { 1, 11, 111 };
fl.splice_after(fl.begin(), fl_);
for (auto value : fl)
cout << value << "\t";
cout << endl;
cout << "fl_容器的元素为:" << endl;
for (auto value : fl_)
cout << value << "\t";
cout << endl << endl;
}
//remove(value);删除链表中所有值为value的元素; fl.remove(value);
if (PRINT || TESTVALUE == 14) {
cout << "TESTVALUE = 14" << endl;
forward_list<int> fl = { 1, 11, 111 };
fl.remove(111);
for (auto value : fl)
cout << value << "\t";
cout << endl << endl;
}
//replace(iterator begin, iterator end, old_value, new_value);将链表中所有等于old_value的元素替换为new_value ,比如这样replace(fl.begin(), fl.end(), 2, 20);
if (PRINT || TESTVALUE == 15) {
cout << "TESTVALUE = 15" << endl;
forward_list<int> fl = { 1, 11, 111 };
replace(fl.begin(), fl.end(), 11, 666);
for (auto value : fl)
cout << value << "\t";
cout << endl << endl;
}
//count(); count(fl.begin(), fl.end(), value);
if (PRINT || TESTVALUE == 16) {
cout << "TESTVALUE = 16" << endl;
forward_list<int> fl = { 1, 11, 111, 11, 11 };
cout << count(fl.begin(), fl.end(), 11) << endl << endl;
}
//sort(); fl.sort(); //使用自己的sort()方法,不能使用std::sort()
if (PRINT || TESTVALUE == 17) {
cout << "TESTVALUE = 17" << endl;
forward_list<int> fl = { 111, 1, 11 };
fl.sort();
//sort(fl.begin,fl.end()); //报错
for (auto value : fl)
cout << value << "\t";
cout << endl << endl;
}
//insert_after(iterator pos, value)
if (PRINT || TESTVALUE == 18) {
cout << "TESTVALUE = 18" << endl;
forward_list<int> fl = { 111, 1, 11 };
fl.insert_after(fl.before_begin(), 666);
for (auto value : fl)
cout << value << "\t";
cout << endl << endl;
}
//insert_after(iterator pos, n, value)
if (PRINT || TESTVALUE == 19) {
cout << "TESTVALUE = 19" << endl;
forward_list<int> fl = { 111, 1, 11 };
fl.insert_after(fl.before_begin(), 2, 666);
for (auto value : fl)
cout << value << "\t";
cout << endl << endl;
}
//insert_after(iterator pos, iterator first, iterator last)
if (PRINT || TESTVALUE == 20) {
cout << "TESTVALUE = 20" << endl;
forward_list<int> fl_ = { 3, 4, 5 };
auto it_first = fl_.begin();
auto it_last = it_first;
advance(it_last, 3);
forward_list<int> fl = { 111, 1, 11 };
fl.insert_after(fl.begin(), it_first, it_last);
for (auto value : fl)
cout << value << "\t";
cout << endl << endl;
}
//erase_after(iterator pos)
if (PRINT || TESTVALUE == 21) {
cout << "TESTVALUE = 21" << endl;
forward_list<int> fl = { 111, 1, 11 };
fl.erase_after(fl.begin());
for (auto value : fl)
cout << value << "\t";
cout << endl << endl;
}
//erase_after(iterator first, iterator last)
if (PRINT || TESTVALUE == 22) {
cout << "TESTVALUE = 22" << endl;
forward_list<int> fl = { 111, 1, 11 };
auto it_first = fl.begin();
auto it_last = it_first;
advance(it_last, 2);
fl.erase_after(it_first, it_last);
for (auto value : fl)
cout << value << "\t";
cout << endl << endl;
}
//remove_if
if (PRINT || TESTVALUE == 23) {
cout << "TESTVALUE = 23" << endl;
forward_list<int> fl = {2, 3, 4, 5, 6, 7, 8};
fl.remove_if(RemoveIf);
for (auto value : fl) {
cout << value << "\t";
}
cout << endl << endl;
}
//reverse
if (PRINT || TESTVALUE == 24) {
cout << "TESTVALUE = 24" << endl;
forward_list<int> fl = {2, 3, 4, 5, 6, 7, 8};
fl.reverse();
for (auto value : fl) {
cout << value << "\t";
}
cout << endl << endl;
}
//partition()容器里符合条件的移到前面,不保持相对顺序
if(PRINT || TESTVALUE == 25){
cout << "TESTVALUE = 25" << endl;
forward_list<int> fl = {1, 2, 3, 4, 5, 6, 7, 8};
partition(fl.begin(), fl.end(), isEven);
cout << "使用partition后的元素为:" << endl;
for(auto value : fl){
cout << value << "\t";
}
cout << endl << endl;
}
return 0;
}
下面是forward_list迭代器的用法
#include
#include
using namespace std;
const int VALUE = 10;
int main()
{
forward_list<int> fl = {5, 2, 3, 4, 5};
//forward_list普通迭代器的用法
cout << "forward_list普通迭代器的用法" << endl;
for(forward_list<int>::iterator it = fl.begin(); it != fl.end(); ++it){
cout << *it << "\t";
}
cout << endl;
//forward_list常量迭代器的用法
cout << "forward_list常量迭代器的用法" << endl;
for(forward_list<int>::const_iterator cit = fl.cbegin(); cit != fl.cend(); ++cit){
cout << *cit << "\t";
}
cout << endl;
/* //forward_list是单向链表容器,所以没有反向迭代器
//forward_list反向迭代器的用法
cout << "forward_list反向迭代器的用法" << endl;
for(forward_list::reverse_iterator rit = fl.rbegin(); rit != fl.rend(); ++rit){
cout << *rit << "\t";
}
cout << endl;
//forward_list常量反向迭代器的用法
cout << "forward_list常量反向迭代器的用法" << endl;
for(forward_list::const_reverse_iterator crit = fl.crbegin(); crit != fl.crend(); ++crit){
cout << *crit << "\t";
}
cout << endl << endl;
*/
for(forward_list<int>::iterator it = fl.begin(); it != fl.end(); ){
cout << "*it = " << *it << endl;
if(*it == 3){
it = fl.insert_after(it, 3 * VALUE);
//此时*it的值是新插入的值,所以需要执行++两次
++it;
++it;
}else if(*it == 2){
//使用erase之后,返回的是下一个有效迭代器的值
it = fl.erase_after(it);
}else{
++it;
}
}
cout << "1现在容器的元素为:" << endl;
for(auto value : fl){
cout << value << "\t";
}
cout << endl << endl;
forward_list<int>::iterator testIt_1 = fl.begin();
++testIt_1;
++testIt_1;
testIt_1 = fl.insert_after(testIt_1, 40);
testIt_1++;
cout << *testIt_1 << endl;
forward_list<int>::iterator testIt_2 = fl.begin();
++testIt_2;
++testIt_2;
++testIt_2;
++testIt_2;
cout << *testIt_2 << endl;
if(testIt_1 == testIt_2){
cout << "testIt_1与testIt_2的迭代器相等" << endl;
}else{
cout << "testIt_1与testIt_2的迭代器不相等" << endl;
}
//从打印中知道,这样的话两个迭代器是相等的
cout << endl;
cout << "2现在容器的元素为:" << endl;
for(auto value : fl){
cout << value << "\t";
}
cout << endl;
forward_list<int>::iterator testIt_3 = fl.begin();
++testIt_3;
++testIt_3;
++testIt_3;
cout << *testIt_3 << endl;
forward_list<int>::iterator testIt_4 = fl.begin();
++testIt_4;
++testIt_4;
testIt_4 = fl.insert_after(testIt_4, 50);
++testIt_4;
cout << *testIt_4 << endl;
if(testIt_3 == testIt_4){
cout << "testIt_3与testIt_4的迭代器相等" << endl;
}else{
cout << "testIt_3与testIt_4的迭代器不相等" << endl;
}
//从打印中知道,这样的话两个迭代器是相等的
cout << endl;
cout << "3现在容器的元素为:" << endl;
for(auto value : fl){
cout << value << "\t";
}
cout << endl;
cout << *testIt_3 << endl;
//testIt_3--; 单向链表,不能这样用
//cout << *testIt_3 << endl;
return 0;
}
forward_list迭代器移动的方式如下:
#include
#include
#include
using namespace std;
int main()
{
forward_list<int> fl = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
cout << "容器的元素为:" << endl;
for(auto value : fl){
cout << value << "\t";
}
cout << endl;
forward_list<int>::iterator it = fl.begin();
cout << "fl.begin()的值为:" << *it << endl;
//it += 1; //it = it + 1; //不能这样使用
++it; //前缀加加
cout << "执行++it;后,*it的值为:" << *it << endl;
//--it; //前缀减减 //不能这样使用
//cout << *it << endl;
it++; //后缀加加
cout << "执行it++;后,*it的值为:" << *it << endl;
//it--; //后缀减减 //不能这样使用
//cout << *it << endl;
advance(it, 1); //这个有可能越界的,可以先使用distance()计算
cout << "执行advance(it, 1);后,*it的值为:" << *it << endl;
//advance(it, -1); //不能这样使用
//cout << *it << endl;
cout << "distance(it, fl.end())的值为:" << distance(it, fl.end()) << endl;
if (distance(it, fl.end()) >= 10) {
advance(it, 10); //这样就不会溢出
}
else {
cout << "没有执行advance(it, 10);" << endl;
}
cout << "distance(fl.begin(), it)的值为:" << distance(fl.begin(), it) << endl;
if (distance(fl.begin(), it) >= 10) {
advance(it, -10);
}
else {
cout << "没有执行advance(it, -10);" << endl;
}
/* //不能这样使用
cout << "distance(it, fl.begin())的值为:" << distance(it, fl.begin()) << endl;
if (distance(it, fl.begin()) <= -10) {
advance(it, -10);
}
else {
cout << "没有执行advance(it, -10);" << endl;
}
*/
it = next(it, 1); //第二个参数不能为负值
if (it != fl.end()) {
cout << "执行next(it, 1);后,*it的值为:" << *it << endl;
}
else {
//抛出异常
}
/* //不能这样使用
it = prev(it, 1); //第二个参数不能为负值
if (it == fl.begin()) {
//这里有可能真正的到达第一个迭代器,也有可能已经越界
}
*/
return 0;
}
会发生forward_lise迭代器失效的例子如下
#include
#include
using namespace std;
const bool PRINT = true;
const int TESTVALUE = 111;
int main()
{
//在迭代器之前插入,不会使forward_list迭代器失效
if(PRINT || TESTVALUE == 1){
forward_list<int> fl = {5, 2, 3, 4, 5};
auto it_1 = fl.before_begin();
++it_1;
fl.insert_after(fl.before_begin(), 666);
cout << *it_1 << endl;
++it_1;
cout << *it_1 << endl;
++it_1;
cout << *it_1 << endl;
}
//在迭代器之后插入,插入不会使forward_list迭代器失效
if(PRINT || TESTVALUE == 2){
forward_list<int> fl = {5, 2, 3, 4, 5};
auto it_1 = fl.before_begin();
fl.insert_after(fl.begin(), 666);
++it_1;
cout << *it_1 << endl;
++it_1;
cout << *it_1 << endl;
++it_1;
cout << *it_1 << endl;
}
//fl.insert_after(it_1, 666); 这样会使迭代器失效
//解决方法一
if(PRINT || TESTVALUE == 3){
forward_list<int> fl = {5, 2, 3, 4, 5};
auto it_1 = fl.before_begin();
fl.insert_after(it_1++, 666);
cout << *it_1 << endl;
++it_1;
cout << *it_1 << endl;
++it_1;
cout << *it_1 << endl;
}
//解决方法二
if(PRINT || TESTVALUE == 4){
forward_list<int> fl = {5, 2, 3, 4, 5};
auto it_1 = fl.before_begin();
it_1 = fl.insert_after(it_1, 666);
++it_1;
cout << *it_1 << endl;
++it_1;
cout << *it_1 << endl;
++it_1;
cout << *it_1 << endl;
}
if(PRINT || TESTVALUE == 5){
forward_list<int> fl = {5, 2, 3, 4, 5};
auto it_1 = fl.before_begin();
fl.erase_after(fl.begin());
it_1++;
cout << *it_1 << endl;
++it_1;
cout << *it_1 << endl;
}
if(PRINT || TESTVALUE == 6){
forward_list<int> fl = {5, 2, 3, 4, 5};
auto it_1 = fl.before_begin();
fl.erase_after(it_1); //迭代器失效
++it_1;
cout << *it_1 << endl;
}
{
forward_list<int> fl = {5, 2, 3, 4, 5};
auto it_1 = fl.before_begin();
fl.erase_after(it_1++); //不可以这样使用,会报错
}
return 0;
}
其他方法对迭代器的影响
#include
#include
#include
#include
using namespace std;
const bool PRINT = true;
const int TESTVALUE = 666;
int main()
{
//swap();交换两个容器的元素 //fl.swap(fl_);
if (PRINT || TESTVALUE == 1) {
cout << "TESTVALUE = 1" << endl;
forward_list<int> fl = { 1, 11, 111 };
auto it = fl.begin();
auto it_end = fl.end();
forward_list<int> fl_ = { 2, 5, 8 };
fl.swap(fl_);
for (; it != it_end; ++it) {
cout << *it << "\t";
}
cout << endl << endl;
}
//assign(n, value);使用n个value代替旧有元素
if (PRINT || TESTVALUE == 2) {
cout << "TESTVALUE = 2" << endl;
forward_list<int> fl = { 1, 11, 111 };
auto it = fl.begin();
auto it_end = fl.end();
fl.assign(6, 666);
//迭代器已经失效
cout << endl;
}
// merge(fl_);当前链表和另一个已排序的链表合并为一个排序后的链表。 fl容器变空链表
if (PRINT || TESTVALUE == 3) {
cout << "TESTVALUE = 3" << endl;
forward_list<int> fl_ = { 1, 11, 111 };
forward_list<int> fl = { 2, 5, 8 };
auto it = fl.begin();
/* 方式一
fl.merge(fl_);
auto it_end = fl.end();
for (; it != it_end; ++it) {
cout << *it << endl;
}
*/
//方式二
auto it_end = fl.end();
fl.merge(fl_);
for (; it != it_end; ++it) {
cout << *it << "\t";
}
cout << endl << endl;
}
//unique();删除链表中相邻的重复元素,只保留一个 fl.unique();
if (PRINT || TESTVALUE == 4) {
cout << "TESTVALUE = 4" << endl;
forward_list<int> fl = { 1, 11, 11, 11, 111 };
auto it = fl.begin();
/* 方式一
fl.unique();
auto it_end = fl.end();
for (; it != it_end; ++it) {
cout << *it << endl;
}
*/
//方式二
auto it_end = fl.end();
fl.unique();
for (; it != it_end; ++it) {
cout << *it << "\t";
}
cout << endl << endl;
}
//splice_after(iterator pos, fl_);将fl_链表的所有元素转移到当前链表位置 fl.splice_after(it, fl_); ll容器变空链表
//splice_after用法二:splice_after(iterator pos, fl_, iterator value); fl.splice_after(it, fl_, fl_.begin());
if (PRINT || TESTVALUE == 5) {
cout << "TESTVALUE = 5" << endl;
forward_list<int> fl_ = { 2,5, 8 };
forward_list<int> fl = { 1, 11, 111 };
auto it = fl.begin();
/* //方式一
fl.splice_after(fl.begin(), fl_);
auto it_end = fl.end();
for (; it != it_end; ++it) {
cout << *it << endl;
}
*/
//方式二
auto it_end = fl.end();
fl.splice_after(fl.begin(), fl_);
for (; it != it_end; ++it) {
cout << *it << "\t";
}
cout << endl << endl;
}
//remove(value);删除链表中所有值为value的元素; fl.remove(value);
if (PRINT || TESTVALUE == 6) {
cout << "TESTVALUE = 6" << endl;
forward_list<int> fl = { 1, 11, 111 };
auto it = fl.begin();
/* 方式一
fl.remove(111);
auto it_end = fl.end();
for (; it != it_end; ++it) {
cout << *it << endl;
}
*/
//方式二
auto it_end = fl.end();
fl.remove(111);
for (; it != it_end; ++it) {
cout << *it << "\t";
}
cout << endl << endl;
}
//replace(iterator begin, iterator end, old_value, new_value);将链表中所有等于old_value的元素替换为new_value ,比如这样replace(fl.begin(), fl.end(), 2, 20);
if (PRINT || TESTVALUE == 7) {
cout << "TESTVALUE = 7" << endl;
forward_list<int> fl = { 1, 11, 111 };
auto it = fl.begin();
/* 方式一
replace(fl.begin(), fl.end(), 11, 666);
auto it_end = fl.end();
for (; it != it_end; ++it) {
cout << *it << endl;
}
*/
//方式二
auto it_end = fl.end();
replace(fl.begin(), fl.end(), 11, 666);
for (; it != it_end; ++it) {
cout << *it << "\t";
}
cout << endl << endl;
}
//sort(); fl.sort();
if (PRINT || TESTVALUE == 8) {
cout << "TESTVALUE = 8" << endl;
forward_list<int> fl = { 111, 1, 11 };
auto it = fl.begin();
auto it_end = fl.end();
fl.sort(); //迭代器已经失效
cout << endl;
}
//push_front()
if (PRINT || TESTVALUE == 9) {
cout << "TESTVALUE = 9" << endl;
forward_list<int> fl = { 1, 11, 111 };
auto it = fl.before_begin();
fl.push_front(666);
auto it_end = fl.end();
++it;
for (; it != it_end; ++it) {
cout << *it << "\t";
}
cout << endl << endl;
}
return 0;
}
上面讲了std::forward_list的方法和迭代器,下面说说std::forward_list的使用场景
1、节省内存:如果只需要单向遍历数据并且希望节省内存,可以使用std::forward_list
2 、头部操作频繁:当需要频繁在头部插入或删除元素时,std::forward_list比std::list更合适
3、不需要尾部操作
4、实现栈或队列
最后给加一个chatgpt中STL的array的方法回答吧
`forward_list`是C++标准模板库(STL)中的一个单向链表容器。下面是`forward_list`容器的所有方法及其作用:
### 构造函数
- **`forward_list()`**: 默认构造函数,创建一个空的`forward_list`。
- **`forward_list(size_type n)`**: 创建一个包含`n`个默认值的元素的`forward_list`。
- **`forward_list(size_type n, const T& value)`**: 创建一个包含`n`个值为`value`的元素的`forward_list`。
- **`forward_list(InputIterator first, InputIterator last)`**: 创建一个包含区间`[first, last)`中元素的`forward_list`。
- **`forward_list(const forward_list& other)`**: 拷贝构造函数,创建一个包含与`other`相同元素的`forward_list`。
- **`forward_list(forward_list&& other)`**: 移动构造函数,创建一个从`other`移动过来的`forward_list`。
- **`forward_list(std::initializer_list<T> ilist)`**: 初始化列表构造函数,创建一个包含`initializer_list`中元素的`forward_list`。
### 赋值操作
- **`forward_list& operator=(const forward_list& other)`**: 拷贝赋值操作符。
- **`forward_list& operator=(forward_list&& other)`**: 移动赋值操作符。
- **`forward_list& operator=(std::initializer_list<T> ilist)`**: 赋值初始化列表中的元素给这个`forward_list`。
### 迭代器
- **`iterator begin()`**: 返回指向容器中第一个元素的迭代器。
- **`const_iterator begin() const`**: 返回指向容器中第一个元素的常量迭代器。
- **`iterator end()`**: 返回指向容器末尾的迭代器(容器末尾的下一个位置)。
- **`const_iterator end() const`**: 返回指向容器末尾的常量迭代器。
### 容量
- **`bool empty() const`**: 检查容器是否为空。
- **`size_type max_size() const`**: 返回容器中元素的最大可能数量。
### 修改器
- **`void assign(size_type n, const T& value)`**: 将容器中的内容替换为`n`个值为`value`的元素。
- **`void assign(InputIterator first, InputIterator last)`**: 将容器中的内容替换为区间`[first, last)`中的元素。
- **`void assign(std::initializer_list<T> ilist)`**: 将容器中的内容替换为`initializer_list`中的元素。
- **`void push_front(const T& value)`**: 在容器的开头插入一个值为`value`的元素。
- **`void push_front(T&& value)`**: 在容器的开头插入一个移动的值为`value`的元素。
- **`void pop_front()`**: 移除容器中的第一个元素。
- **`iterator insert_after(const_iterator pos, const T& value)`**: 在`pos`位置之后插入一个值为`value`的元素。
- **`iterator insert_after(const_iterator pos, T&& value)`**: 在`pos`位置之后插入一个移动的值为`value`的元素。
- **`iterator insert_after(const_iterator pos, size_type n, const T& value)`**: 在`pos`位置之后插入`n`个值为`value`的元素。
- **`iterator insert_after(const_iterator pos, InputIterator first, InputIterator last)`**: 在`pos`位置之后插入区间`[first, last)`中的元素。
- **`iterator insert_after(const_iterator pos, std::initializer_list<T> ilist)`**: 在`pos`位置之后插入`initializer_list`中的元素。
- **`iterator erase_after(const_iterator pos)`**: 移除`pos`位置之后的元素。
- **`iterator erase_after(const_iterator first, const_iterator last)`**: 移除区间`[first, last)`中的元素。
- **`void swap(forward_list& other)`**: 交换两个`forward_list`容器的内容。
- **`void resize(size_type n)`**: 调整容器的大小为`n`,如果当前大小大于`n`,则移除多余的元素,如果当前大小小于`n`,则插入缺少的默认值元素。
- **`void resize(size_type n, const T& value)`**: 调整容器的大小为`n`,如果当前大小大于`n`,则移除多余的元素,如果当前大小小于`n`,则插入缺少的值为`value`的元素。
- **`void clear()`**: 移除容器中的所有元素。
### 操作
- **`void remove(const T& value)`**: 移除所有值为`value`的元素。
- **`template <class Predicate> void remove_if(Predicate pred)`**: 移除所有满足谓词`pred`的元素。
- **`void unique()`**: 移除所有相邻的重复元素。
- **`template <class BinaryPredicate> void unique(BinaryPredicate binary_pred)`**: 使用二元谓词`binary_pred`移除所有相邻的重复元素。
- **`void merge(forward_list& other)`**: 合并另一个`forward_list`到当前容器,两个容器必须已排序。
- **`template <class Compare> void merge(forward_list& other, Compare comp)`**: 使用比较函数`comp`合并另一个`forward_list`到当前容器。
- **`void sort()`**: 对容器中的元素进行升序排序。
- **`template <class Compare> void sort(Compare comp)`**: 使用比较函数`comp`对容器中的元素进行排序。
- **`void reverse()`**: 反转容器中的元素顺序。
- **`void splice_after(const_iterator pos, forward_list& other)`**: 将`other`中的所有元素接合到当前容器的`pos`位置之后。
- **`void splice_after(const_iterator pos, forward_list&& other)`**: 将`other`中的所有元素接合到当前容器的`pos`位置之后(右值版本)。
- **`void splice_after(const_iterator pos, forward_list& other, const_iterator it)`**: 将`other`中的单个元素接合到当前容器的`pos`位置之后。
- **`void splice_after(const_iterator pos, forward_list&& other, const_iterator it)`**: 将`other`中的单个元素接合到当前容器的`pos`位置之后(右值版本)。
- **`void splice_after(const_iterator pos, forward_list& other, const_iterator first, const_iterator last)`**: 将`other`中`[first, last)`的元素接合到当前容器的`pos`位置之后。
- **`void splice_after(const_iterator pos, forward_list&& other, const_iterator first, const_iterator last)`**: 将`other`中`[first, last)`的元素接合到当前容器的`pos`位置之后(右值版本)。
### 观察器
- **`allocator_type get_allocator() const`**: 返回与容器关联的分配器。