STL--list(使用)

目录

list的介绍

list的使用

构造相关的

空构造

构造n个值为val的元素

用一段迭代区间构造

拷贝构造

列表格式化 

遍历相关的

迭代器正反遍历

范围for遍历

修改相关的

 push_back和pop_back

push_front和pop_front

insert和erase

swap

resize

clear

容量相关的

size

empty 

元素访问相关的

front

back 

迭代器相关的

begin和end

rbegin和rend

cbegin cend和crbegin crend 

操作相关的

 reverse

sort

merge

unique

remove_if

remove

splice

assing

总结函数的使用:

​编辑 

list的介绍

  1. list是可以在常数范围内任意位置进行插入和删除的序列容器,并且该容器可以前后双向迭代.
  2. list的底层是双链表结构,链表中每一个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素.
  3. list与forward_list非常相似,主要不同在于forward_list是单链表,只能向前迭代.
  4. 与其他的序列容器相比(array,vector,deque),list通常在任意位置进行插入移除元素的效率更好.
  5. 与其他容器相比,list和forward_list最大的缺陷是不支持任意位置的访问.

list的使用

构造相关的

空构造

list l1;

构造n个值为val的元素

	list l2(4, 100);

用一段迭代区间构造

string s1("hello world");
	list l4(s1.begin(),s1.end());
	int array[] = { 1,2,3,4 };
	list l5(array, array + sizeof(array) / sizeof(array[0]));

拷贝构造

list l2(4, 100);
list l3(l2);

列表格式化 

	list l6{ 1,2,3,4,5 };

遍历相关的

迭代器正反遍历

正向遍历

list l1{ 1,2,3,4,5,6 };
	list::iterator it = l1.begin();
	while (it != l1.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;

 反向遍历

list::reverse_iterator rit = l1.rbegin();
	while (rit != l1.rend())
	{
		cout << *rit << " ";
		++rit;
	}
	cout << endl;

范围for遍历

for (auto e : l1)
	{
		cout << e << " ";
	}
	cout << endl;

 提示:范围for底层的实现也是迭代器

修改相关的

 push_back和pop_back

push_back是在末尾插入一个元素,pop_back是在末尾删除一个元素

list l1{ 1,2,3,4,5,6 };
	for (auto e : l1)
	{
		cout << e << " ";
	}
	cout << endl;
	//push_back
	l1.push_back(7);
	for (auto e : l1)
	{
		cout << e << " ";
	}
	cout << endl;
	//pop_back
	l1.pop_back();
	for (auto e : l1)
	{
		cout << e << " ";
	}
	cout << endl;

push_front和pop_front

push_front是在容器的前面插入一个元素,pop_front是在容器的前面删除一个数据.

    //push_front
	l1.push_front(0);
	for (auto e : l1)
	{
		cout << e << " ";
	}
	cout << endl;
	//pop_front
	l1.pop_front();
	for (auto e : l1)
	{
		cout << e << " ";
	}
	cout << endl;

insert和erase

insert是在pos为值插入一个元素,erase实在pos位置删除一个元素.

    //insert
	l1.insert(l1.begin(), 0);
	for (auto e : l1)
	{
		cout << e << " ";
	}
	cout << endl;
	//erase
	l1.erase(l1.begin());
	for (auto e : l1)
	{
		cout << e << " ";
	}
	cout << endl;

swap

swap是交换两个容器的内容


	list l1;
	list l2{ 1,2,3,4 };
	for (auto e : l1)
	{
		cout << e << " ";
	}
	cout << endl;
	l1.swap(l2);
	for (auto e : l1)
	{
		cout << e << " ";
	}
	cout << endl;
	for (auto e : l2)
	{
		cout << e << " ";
	}
	cout << endl;

resize

resize使用规则:

  1. 当n大于当前容器的size是,将size扩大到n,扩大的数据为给出的第二个值,若未给出,调用其构造函数给出默认值.
  2. 当n小于当前的size时,将size缩小到n 
l1.resize(3);
	for (auto e : l1)
	{
		cout << e << " ";
	}
	cout << endl;
	

clear

clear是清除元素的有效内容

l1.clear();
	for (auto e : l1)
	{
		cout << e << " ";
	}
	cout << endl;

容量相关的

size

size返回的是容器有效元素的个数

list l1{ 1,2,3,4 };
	cout << l1.size() << endl;

empty 

empty返回的是bool值,若容器为空返回true,不为空返回false. 

元素访问相关的

front

front返回的是首元素的值. 

list l1{ 1,2,3,4 };
	cout << l1.front()<

back 

back返回的是尾元素的值

list l1{ 1,2,3,4 };
	cout << l1.front()<

迭代器相关的

STL--list(使用)_第1张图片

begin和end

begin返回的是第一个有效元素的迭代器,end返回的是最后一个元素下一个位置的迭代器. 

list l1{ 1,2,3,4 };
	//begin和end
	list::iterator begin = l1.begin();
	cout << *begin << endl;
	list::iterator end = l1.end();
	cout << *(--end) << endl;

rbegin和rend

rbegin返回的是最后一个元素的迭代器,rend返回的是第一个元素前一个位置的迭代器.

//rbegin和rend
	list::reverse_iterator rbegin = l1.rbegin();
	cout << *(rbegin) << endl;
	list::reverse_iterator rend = l1.rend();
	cout << *(--rend) << endl;

cbegin cend和crbegin crend 

这四个函数在这里就不介绍了,和前面四个类似,不过这四个返回的是不可修改的. 

操作相关的

 reverse

reverse函数将容器内的元素逆置.

list l1{ 1,2,3,4 };
	for (auto e : l1)
	{
		cout << e << " ";
	}
	cout << endl;
	l1.reverse();
	for (auto e : l1)
	{
		cout << e << " ";
	}
	cout << endl;

sort

sort函数将容器当中的元素默认以升序进行排序.

list l2{ 4,5,7,3,8 };
	l2.sort();
	for (auto e : l2)
	{
		cout << e << " ";
	}
	cout << endl;

merge

merge将一个容器内个元素合并到另一个元素. 但是两个容器内的内容需要是有序的.

list l3 = {1,2,3,4};
	list l4{ 5,6,7,8 };
	l3.merge(l4);

unique

unique用于删除容器中连续的重复元素. 

list l5{ 1,2,2,3,3,4,4,4,4 };
	l5.unique();
	for (auto e : l5)
	{
		cout << e << " ";
	}
	cout << endl;

remove_if

remove_if函数用于删除容器中满足条件的元素.

bool single_digit(const int& val)
{
	return val > 10;
}
void test9()
{
	list l1{ 1,23,2,5,4,8,64,2,85,2 };
	l1.remove_if(single_digit);//删除大于10的元素
	for (auto e : l1)
	{
		cout << e << " ";
	}
	cout << endl;
}

remove

用于删除容器中特定值的元素.

list l1{ 1,2,3,4,5 };
	l1.remove(5);
	for (auto e : l1)
	{
		cout << e << " ";
	}
	cout << endl;

splice

splice函数用于两个容器之间的拼接,

  1. 将整个容器拼接到另一个容器指定的位置.
  2. 将指定容器中的一个数据拼接到另一个容器的指定位置.
  3. 将指定容器中一段区间的数据拼接到另一个容器的指定位置. 
void test11()
{
	list l1(6, 6);
	list l2(8, 8);
	l1.splice(l1.end(), l2);
	for (auto e : l1)
	{
		cout << e << " ";
	}
	cout << endl;
	list l3(6, 6);
	list l4(8, 8);
	l3.splice(l3.end(), l4, l4.begin());
	for (auto e : l3)
	{
		cout << e << " ";
	}
	cout << endl;
	list l5(6, 6);
	list l6(8, 8);
	l5.splice(l5.begin(),l6, l6.begin(), l6.end());
	for (auto e : l5)
	{
		cout << e << " ";
	}
}

assing

assing函数将新内容分配给容器,替换器当前内容.

  1. 将n个值为val的数据分配给容器.
  2. 将一段迭代区间内容分配给容器. 
void test12()
{
	list l1(4, 6);
	l1.assign(4, 8);
	for (auto e : l1)
	{
		cout << e << " ";
	}
	cout << endl;
	int array[] = { 1,1,1,1 };
	list l2(4, 6);
	l2.assign(array, array + sizeof(array) / sizeof(array[0]));
	for (auto e : l2)
	{
		cout << e << " ";
	}
	cout << endl;
}

总结函数的使用:

STL--list(使用)_第2张图片 

你可能感兴趣的:(c++,开发语言)