STL——灵活的线性表 C++中以EOF结束 等同于 while(cin>j)

本文介绍了一种灵活容器的实现方式,能够高效地处理数组和链表等线性结构的常见操作,包括插入、删除和访问等。通过使用C++ STL中的vector容器,实现了对线性表的操作,并详细解释了assign、insert和erase等函数的应用。

Description
数组和链表是我们熟知的两种线性结构,但是它们不够灵活(不能同时实现直接插入、删除和访问操作),给你若干种操作,你能通过一种灵活的容器,实现它们的功能吗?
操作1:Build a b (产生一个大小为a的线性表,其值全部赋为b,每组样例仅出现一次,在起始行)
操作2:Modify a b (将线性表的第a个元素的值设为b)
操作3:Insert a b c (在线性表的第a个位置插入第b到第c个位置的所有元素)
操作4:Erase a b(删除线性表第a到第b个位置的所有元素)
操作5:Print a b (输出线性表的第a到第b个元素)
程序在执行操作5的时候要输出结果,格式如“[1]:3 [2]:4 [3]:5”([]内为线性表的位置,“:”后面为元素的值,不带引号,每组输出占一行)

Input

输入有多行,对应5个操作,以EOF结束

Output

见Sample

Sample Input
Build 10 1
Modify 2 2
Insert 3 1 2
Modify 6 4
Erase 3 5
Print 1 8
Sample Output

[1]:1 [2]:2 [3]:4 [4]:1 [5]:1 [6]:1 [7]:1 [8]:1

HINT

使用vector可以很容易解决

Append Code


AC代码

#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main()
{
    string j;//因为输入的为一个很长的字符串,所以可以设置为string类型;
    int a,b,k;
    vector<int> c;//注意定义的位置,因为j是一直要输入的,所以要定义在外面,不能定义在里面,如果在里面,使用的时候会自动清零//这里c即为动态的一维数组;
    while(cin>>j)
    {
        if(j=="Build")//下面不一定都要用else if,其实用if也可以;
        {
            cin>>a>>b;
            c.assign(a,b);//具体用法见下面   一
        }
        else if(j=="Insert")
        {
            cin>>a>>b>>k;
            c.insert(c.begin()+a-1,c.begin()+b-1,c.begin()+k);//具体用法见下面   二
        }
        else if(j=="Modify")
        {
            cin>>a>>b;
            c[a-1]=b;//注意这里的赋值方法;vector本身就是一个数组类型,所以可以使用[],但是在set容器中是不能够直接使用[]的;
        }
        else if(j=="Erase")//具体用法见下面   三
        {
            cin>>a>>b;
            c.erase(c.begin()+a-1,c.begin()+b);
        }
        else if(j=="Print")
        {
            int i;
            cin>>a>>b;
            for(i=a-1;i<=b-1;i++)//不能for(i=c.begin()+a-1;i<=c.begin()+b-1;c++),因为没有用迭代器;
            {
                if(i==b-1)//看清楚题目,一定要注意格式;
                    cout<<"["<<i+1<<"]:"<<c[i]<<endl;
                else
                    cout<<"["<<i+1<<"]:"<<c[i]<<" ";
            }
        }
    }
    return 0;
}

一、C++STL中vector容器 assign()函数的用法
1、功能:
(1)将区间
[first,last)
(这里表示的是位置)的元素赋值到当前的vector容器中,或者赋n个值为x的元素到vector容器中,这个容器会清除掉vector容器中以前的内容。
(2)把n个x赋值给调用者vector<int> i;i.assign(n,x);
二、C++STL中vector容器insert()函数
(1)在指定位置loc前插入值为val的元素,返回指向这个元素的迭代器,
(2)在指定位置loc前插入num个值为val的元素
(3)在指定位置loc前插入区间
[start, end)
(这里表示的是位置)的所有元素 .//第a个位置表示第a+1个元素,比如第0个位置表示的是第一个元素;
举例:

//创建一个vector,置入字母表的前十个字符
vector <char> i;
for( int i=0; i < 10; i++ )
  i.push_back( i + 65 );

//插入四个a到vector中
vector <char>::iterator c = i.begin();
i.insert( c, 4, 'a' );

//显示vector的内容
for( a= i.begin(); a != i.end();a++ )
cout < < *a;

三、C++STL中vector容器erase()函数
1、功能:
(1)清除掉vector容器中区间**[first,last)**的内容。


注意:
1、定义容器的位置
2、用erase、insert的区间
3、各种函数的用法

### C++ STL 语法总结 #### 1. STL 基本概念 STL (Standard Template Library),即标准模板库,是 ANSI/ISO C++ 标准程序库的重要组成部分。它提供了丰富的容器、算法以及迭代器支持,极大地简化了开发过程并提高了代码的复用性和效率[^2]。 --- #### 2. 容器(Container) STL 提供了几种主要类型的容器: - **序列式容器** 序列式容器按照线性顺序存储元素。 - `vector`:动态数组,支持随机访问。 ```cpp std::vector<int> vec = {1, 2, 3}; vec.push_back(4); // 添加新元素到末尾 int firstElement = vec.at(0); // 访问第一个元素 ``` - `list`:双向链表,适合频繁插入删除操作。 ```cpp std::list<std::string> lst; lst.emplace_front("hello"); // 插入到头部 lst.emplace_back("world"); // 插入到尾部 ``` - `deque`:双端队列,两端均可高效插入和删除。 - **关联式容器** 关联式容器通过键值对的方式存储数据,并保持内部有序或无序状态。 - `set/multiset`:集合容器,不允许重复元素(`multiset`允许)。 ```cpp std::set<int> s = {3, 1, 4, 1}; // 自动去重并排序 auto it = s.find(3); // 查找某个元素 if(it != s.end()) { s.erase(it); // 删除指定位置的元素 } ``` - `map/multimap`:映射容器,基于键值对存储数据。 ```cpp std::map<std::string, int> m; m["apple"] = 5; // 插入键值对 int countApples = m["apple"]; // 获取对应值 ``` - `unordered_set/unordered_map`:哈希实现的集合和映射容器,不保证顺序但查询速度更快。 --- #### 3. 迭代器(Iterator) 迭代器是一种泛化指针的概念,用于遍历容器中的元素。 - **输入输出流迭代器** 输入流迭代器可以从输入源读取数据;输出流迭代器可以向目标写入数据。 ```cpp std::istream_iterator<int> in_iter(std::cin), eof; while(in_iter != eof){ std::cout << *in_iter++ << "\n"; } ``` - **常见操作** 使用解除引用(`*`)获取当前指向的值,使用自增(`++`)移动至下一位置[^3]。 --- #### 4. 算法(Algorithm) STL 提供了大量的通用算法,这些算法独立于具体的数据结构。 - **查找与修改** - `std::find`: 寻找特定值的第一个匹配项。 ```cpp std::vector<int> v = {1, 2, 3, 4}; auto pos = std::find(v.begin(), v.end(), 3); if(pos != v.end()){ std::cout << "Found value: " << *pos << "\n"; } ``` - `std::transform`: 对范围内的每个元素应用函数。 ```cpp std::vector<double> input = {1.1, 2.2, 3.3}, output(input.size()); std::transform(input.begin(), input.end(), output.begin(), [](double val){return val * 2;}); ``` - **排序与排列** - `std::sort`: 排序给定区间的内容,默认升序。 ```cpp std::vector<int> data = {5, 3, 8, 6}; std::sort(data.begin(), data.end()); // 结果为{3, 5, 6, 8} ``` - `std::next_permutation`: 将序列重新排列成字典序下的下一个更大的排列。 ```cpp std::vector<char> chars = {'a', 'b', 'c'}; do{ for(auto ch : chars) std::cout << ch; std::cout << "\n"; }while(std::next_permutation(chars.begin(), chars.end())); ``` --- #### 5. 函数对象(Function Object) 也称为仿函数(Functor),是一类实现了调用接口的对象。 ```cpp struct Adder { int operator()(int a, int b)const{return a+b;} }; Adder addObj; std::cout << addObj(3, 4) << "\n"; // 输出7 ``` --- #### 6. 实际应用场景 在实际编程中,合理利用 STL 可以显著提升生产力。例如,在处理大规模数据集时,优先选用性能优越的容器类型如 `vector` 或者优化过的算法组合能够带来事半功倍的效果。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值