[熟悉set、map的各种操作]

本文通过实例展示了如何使用 C++ STL 中的 set 和 multiset 容器进行数据插入、查找、区间选择及删除等操作,并介绍了 map 的使用方法及成员函数 find、equal_range 和 count 的应用。

1、 键盘输入若干整数,分别插入set和multiset,并显示它们;

2、 键盘输入整数x、y,要求(x<=y),使用lower_bound和upper_bound分别求出[x,y]间的所有整数并输出;

3、 对两个集合,删除[x,y]间数据;

4、 建立map< string , int > m,插入下列数据,显示结果:
student_one 1
student_three 3
student_two 2
student_one 10

要求分别使用inert和 [] 实现插入。
附:pair的使用:

pair  <T1,T2 p1(v1,v2);  //用v1、v2构造一pair对象p1
pair  <T1,T2>(v1,v2);     //用v1、v2构造一临时pair对象
make_pair(v1,v2);       //用v1、v2生成一临时pair对象

5、练习查询类成员函数的使用,包括下列成员函数。
(1) find
(2) equal_range
(3) count

源代码:

#include <iostream>
#include <set>
#include <iterator>
#include <vector>
#include <map>

using namespace std;
void display_set(set<int>& s);
void display_multiset(multiset<int>& s);

void main()
{
    vector <int> v;
    set<int> myset;
    multiset<int> mymultiset;

    /* 键盘输入若干整数,分别插入set和multiset,并显示它们*/

    copy(istream_iterator<int>(cin), istream_iterator<int>(), back_inserter(v));
    for (int i = 0; i < v.size(); i++)
    {
        mymultiset.insert(v[i]);
    }
    for (int i = 0; i < v.size(); i++)
    {
        myset.insert(v[i]);
    }
    cout << "myset集合:" << endl;
    display_set(myset);
    cout << endl;
    cout << "mymultiset集合:" << endl;
    display_multiset(mymultiset);
    cout << endl << endl;

    /*键盘输入整数x、y,要求(x<=y),对上面的两个集合使用lower_bound和upper_bound分别求出[x,y]间的所有整数并输出;*/

    int set_x;
    int set_y;
    int multiset_x;
    int multiset_y;
    pair<set<int>::iterator, set<int>::iterator> rangeset;
    pair<multiset<int>::iterator, multiset<int>::iterator> rangemultiset;
    cout << "输入整数 x = 2" << endl;   /*cin >> set_x;*/
    set_x = 2;
    cout << "输入整数 y = 4" << endl;   /*cin >> set_y;*/
    set_y = 4;
    rangeset.first = myset.lower_bound(set_x);
    rangeset.second = myset.upper_bound(set_y);
    set<int>::iterator set_t;
    cout << "set    [x,y]间的所有整数并输出 : " << endl;
    for (set_t = rangeset.first; set_t != rangeset.second; set_t++)
   {
        cout << *set_t << "\t";
    }
    cout << endl << endl;
    cout << "输入整数 x = 2" << endl;   /*cin >> set_x;*/
    multiset_x = 2;
    cout << "输入整数 y = 4" << endl;   /*cin >> set_y;*/
    multiset_y = 4;
    rangemultiset.first = mymultiset.lower_bound(multiset_x);
    rangemultiset.second = mymultiset.upper_bound(multiset_y);
    multiset<int>::iterator multiset_t;
    cout << "multiset    [x,y]间的所有整数并输出 : " << endl;
    for (multiset_t = rangemultiset.first; multiset_t != rangemultiset.second; multiset_t++)
    {
        cout << *multiset_t << "\t" ;
    }
    cout << endl << endl;

    /*对两个集合,删除2题得到的[x,y]间数据;*/

    cout << "set对两个集合,删除2题得到的[x,y]间数据" << endl;
    myset.erase(rangeset.first, rangeset.second);
    cout << "myset集合:" << endl;
    display_set(myset);
    cout << endl;
    cout << "multiset_t对两个集合,删除2题得到的[x,y]间数据" << endl;
    mymultiset.erase(rangemultiset.first, rangemultiset.second);
    cout << "mymultiset集合:" << endl;
    display_multiset(mymultiset);
    cout << endl << endl;

    /*建立map< string , int > m,插入下列数据,显示结果:*/

    map<string, int> m;
    pair<string, int> m1("student_one", 1);
    m.insert(m1);
    //用v1、v2构造一pair对象m1
    m.insert(pair<string, int> ("student_three", 3));
    //用v1、v2构造一临时pair对象
    m.insert(make_pair("student_two", 2));
    //用v1、v2生成一临时pair对象
    m["student_one"] = 10;
    //使用[] 实现插入
    int m_1 = m["student_one"];
    if (m_1 > 0)
    {
        cout << "student_one 是" << m_1 << endl;
    }
    else { cout << "student_one 没有!" << endl; }


    /*在基础上,练习查询类成员函数的使用(find 、equal_range、 count )*/

    set<int>::iterator set_find = myset.find(3);
    //返回等于3的迭代器;
    pair<multiset<int>::iterator, multiset<int>::iterator> set_equal_range;
    set_equal_range = myset.equal_range(3);
    //返回2个迭代器
    int nCount = myset.count(3);
    cout << "nCount  = " << nCount << endl;
    //返回3的个数
    system("pause");
}

void display_multiset(multiset<int>& s)
{
    multiset<int>::iterator te = s.begin();
    while (te != s.end())
    {
        cout << *te << "\t";
        te++;
    }
    cout << endl;
}
void display_set(set<int>& s)
{
    set<int>::iterator te = s.begin();
    while (te != s.end())
    {
        cout << *te << "\t";
        te++;
    }
    cout << endl;
}
### Java中List、SetMap接口的特点和区别 #### 1. **List 接口** - List 是一个有序集合,允许存储重复元素,并且可以通过索引访问元素[^1]。 - List 的主要实现类包括 `ArrayList` 和 `LinkedList`。 - 特点: - 元素有明确的顺序,插入和删除操作会影响后续元素的位置。 - 支持通过索引快速访问元素。 - 用法示例: ```java import java.util.ArrayList; import java.util.List; public class ListExample { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("Apple"); list.add("Banana"); list.add("Apple"); // 允许重复元素 System.out.println(list.get(1)); // 输出 "Banana" } } ``` #### 2. **Set 接口** - Set 是一个不允许存储重复元素的集合,不保证元素的顺序[^1]。 - 主要实现类包括 `HashSet` 和 `TreeSet`。 - 特点: - 不允许重复元素。 - 没有索引概念,无法通过位置访问元素。 - 用法示例: ```java import java.util.HashSet; import java.util.Set; public class SetExample { public static void main(String[] args) { Set<String> set = new HashSet<>(); set.add("Apple"); set.add("Banana"); set.add("Apple"); // 不会添加重复元素 System.out.println(set); // 输出可能为 "[Banana, Apple]" } } ``` #### 3. **Map 接口** - Map 是一种键值对(key-value)存储结构,键是唯一的,值可以重复[^2]。 - 主要实现类包括 `HashMap` 和 `TreeMap`。 - 特点: - 键唯一,值可以重复。 - 不保证键值对的顺序,除非使用 `LinkedHashMap` 或 `TreeMap`。 - 用法示例: ```java import java.util.HashMap; import java.util.Map; public class MapExample { public static void main(String[] args) { Map<Integer, String> map = new HashMap<>(); map.put(1, "小张"); map.put(2, "小明"); map.put(3, "小王"); map.put(1, "小花"); // 更新键为 1 的值 for (Map.Entry<Integer, String> entry : map.entrySet()) { System.out.println(entry.getKey() + "=" + entry.getValue()); } // 输出可能为 "2=小明" "3=小王" "1=小花" } } ``` #### 区别总结 - **List**:有序集合,允许重复元素,支持索引访问。 - **Set**:无序集合(某些实现如 `TreeSet` 可排序),不允许重复元素。 - **Map**:键值对存储结构,键唯一,值可以重复,不保证顺序。 ### 面试要点 - 熟悉各集合的特性及适用场景。 - 掌握常用实现类的区别,例如 `ArrayList` 和 `LinkedList` 的性能差异。 - 理解 `HashMap` 的工作原理及其线程安全性问题[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值