C ++模板堆栈映射/多映射[关闭]

Posted

技术标签:

【中文标题】C ++模板堆栈映射/多映射[关闭]【英文标题】:C++ template stack map/multimap [closed] 【发布时间】:2021-08-30 05:50:26 【问题描述】:

我必须测量将 100000 个 int 类型的数字添加到不同类型的容器中需要多少时间。所以有 standardvectorlist - 这些都是正确完成的。而且我在执行 ma​​pmultimap 时遇到了问题,然后我必须测量删除每个容器的所有这些元素所需的时间。有什么线索吗?

每个容器必须容纳 100000 个 int 类型编号。

    创建堆栈容器 (s1)。测量向其中添加 100000 个数字需要多少时间。 创建一个堆栈容器 (s2),它将像矢量容器一样管理内存。测量向其中添加 100000 个数字需要多少时间。 创建一个堆栈容器 (s3),它将像列表容器一样管理内存。测量向其中添加 100000 个数字需要多少时间。 创建一个堆栈容器 (s2),它将像地图容器一样管理内存。测量向其中添加 100000 个数字需要多少时间。 创建一个堆栈容器 (s2),它将像多映射容器一样管理内存。测量添加100000需要多少时间 给它编号。 测量删除所有容器的元素所需的时间。

附加信息:

    使用标准 C++ 计时方法。可以这样计算时间:
clock_t begin = clock();
//instructions
clock_t end = clock();
double elapsed_secs = double(end - begin) / CLOCKS_PER_SEC;
cout << elapsed_secs <<endl;
    使用两种类型的自己的堆栈实现:
未优化(正常工作且未定向以减少耗时的操作) 优化(正常工作,但也旨在减少耗时的操作)

也是基于标准栈类的实现。

#include <iostream>
#include <stack>
#include <vector>
#include <list>
#include <map>

using namespace std;


template <class T>
void timeTest(T s)

    clock_t begin = clock();
    for (int i = 0; i < 100000; i++)  s.push(i); 
    clock_t end = clock();
    double elapsed_secs = double(end - begin) / CLOCKS_PER_SEC;
    cout << elapsed_secs << endl;


/*
template <class T, class S>
void timeTest(stack <int, map <int, int>> s)

    clock_t begin = clock();
    for (int i = 0; i < 100000; i++)  s.emplace(i, i); 
    clock_t end = clock();
    double elapsed_secs = double(end - begin) / CLOCKS_PER_SEC;
    cout << elapsed_secs << endl;


template <class T, class S>
void timeTest(stack <pair <int, int>, multimap <int, int>> s)

    clock_t begin = clock();
    for (int i = 0; i < 100000; i++)  s.emplace(i, i); 
    clock_t end = clock();
    double elapsed_secs = double(end - begin) / CLOCKS_PER_SEC;
    cout << elapsed_secs << endl;

*/


int main()

    stack <int> s1;
    stack <int, vector <int>> s2;
    stack <int, list <int>> s3;
    //stack <int, map <int, int>> s4;
    //stack<pair<int, int>, multimap<int, int>> s5;


    timeTest(s1);
    timeTest(s2);
    timeTest(s3);
    //timeTest(s4);
    //timeTest(s5);

【问题讨论】:

你有什么问题?? 之前有人问过同样的问题:***.com/questions/67963760/… 评论部分 (4.) - 我必须在地图中放置 100000 个元素并测量时间 std::map 不满足stack 的要求... 为什么要使用stack 适配器进行测试? “我必须写一些代码作为我的作业”不是问题。请尝试解释您已经尝试过的内容、失败的原因以及缺少的内容。 【参考方案1】:

找到解决办法

#include <iostream>
#include <time.h>
#include <math.h>
#include <vector>
#include <map>
#include <list>
#include <stack>
using namespace std;

template<class T>
void test(T t,const int I = 1000000) 
    clock_t begin = clock();
    cout << "Uzupelnianie:\t";
    for (int i = 0; i <= I; i++) 
        t.push(i);
    
    clock_t end = clock();
    double elapsed_secs = double(end - begin) / CLOCKS_PER_SEC;
    cout << elapsed_secs << endl;
    cout << "Usuwanie:\t";
    begin = clock();
    for (int i = 0; i <= I; i++) 
        t.pop();
    
    end = clock();
    elapsed_secs = double(end - begin) / CLOCKS_PER_SEC;
    cout << elapsed_secs << endl;



template<class T>
class Mapa 
public:
    map<T, T> mapa;
    using value_type = typename T;
    using reference = typename map<T, T>::reference;
    using const_reference = typename map<T, T>::const_reference;
    using size_type = typename map<T, T>::size_type;
    using container_type = map<T, T>;
    
    
    void push_back(T i) 
        mapa.emplace(i, i);
    
    void pop_back()         
        mapa.erase(prev(mapa.end()));
    
    void empty() 
        cout << "empty\n";
    
    void back() 
        cout << "back\n";
    
    void size() 
        cout << "size\n";
    
    
;

template<class T>
class MultiMapa 
public:
    multimap<T, T> mapa;
    using value_type = typename T;
    using reference = typename multimap<T, T>::reference;
    using const_reference = typename multimap<T, T>::const_reference;
    using size_type = typename multimap<T, T>::size_type;
    using container_type = multimap<T, T>;


    void push_back(T i) 
        mapa.emplace(i, i);
    
    void pop_back() 
        mapa.erase(prev(mapa.end()));
    
    void empty() 
        cout << "empty\n";
    
    void back() 
        cout << "back\n";
    
    void size() 
        cout << "size\n";
    

;

int main()

    const int N = 1000000;
    stack<int> s1;
    stack<int, vector<int>> s2;
    stack<int, list<int>> s3;
    
    stack<int, Mapa<int>> s4; 
    stack<int, MultiMapa<int>> s5;
    cout << "Stack:\n";
    test(s1, N);

    cout << "Vector:\n";
    test(s2, N);

    cout << "List:\n";
    test(s3, N);

    cout << "Map:\n";
    test(s4,N); 
    
    cout << "MultiMapa:\n";
    test(s5, N);

【讨论】:

请注意,即使您的包装器使代码编译,行为也会“损坏”(尝试查看堆栈的内容)。所以你的基准测试毫无用处。

以上是关于C ++模板堆栈映射/多映射[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

映射关系模板--一对一, 一对多

将一个函数模板的模板参数映射到另一个函数模板的参数(c ++)

C++ - 通过引用模板函数传递 STL 映射

C++ 使用具有无序映射的模板类型

flask 中orm关系映射 sqlalchemy的查询

聊聊elasticsearch7.8的模板和动态映射