`std :: vector` vs`std :: queue`的性能

时间:2014-05-31 13:46:58

标签: c++ vector stl queue

我已经向this problem on spoj.com提交了一个解决方案,这个网站会出现问题,您可以提交解决方案然后进行判断并给出三个结果中的一个 - 接受,错误答案或超出时间限制。我正在处理的特殊问题有4秒的时间限制。

我的第一个解决方案使用std::vector,如下所示:

#include<bits/stdc++.h>
using namespace std;
#define inf 10000000
typedef pair<int,int> pii;

int main()
{
int t,n,m;
cin>>t;
char str[200][200];
int dist[200][200];
while(t--)
    {
    cin>>n>>m;
    for(int i=0;i<n;i++)
        scanf("%s",str[i]);

    set< pii > ms;
    for(int i=0;i<n;i++)
        {
        for(int j=0;j<m;j++)
            {
            if(str[i][j]=='1')
                { dist[i+1][j+1]=0;   ms.insert( make_pair<int,int> (i+1,j+1));  }
            else
                dist[i+1][j+1]=inf;
            }
        }
    int dis=0,rr,cc,p,q;
    pii pi,temp;
    pii nei[5];

    while(ms.empty()==0)   // bfs
        {
            pi=*ms.begin();
            p=pi.first;
            q=pi.second;
            ms.erase(ms.begin());

            vector< pii > v;
            v.push_back(make_pair<int,int>(p,q));

                while(!v.empty())
                {
                    temp = *v.begin();
                    v.erase(v.begin());

                    nei[1].first=temp.first-1; nei[1].second=temp.second;
                    nei[2].first=temp.first+1; nei[2].second=temp.second;
                    nei[3].first=temp.first;   nei[3].second=temp.second+1;
                    nei[4].first=temp.first;   nei[4].second=temp.second-1;

                    for(int i = 1; i<=4; ++i)
                    {
                        rr=nei[i].first;
                        cc=nei[i].second;

                        if(rr>=1 && rr<=n && cc>=1 && cc<=m )
                            {
                                dis=abs(rr-p) + abs(cc-q);

                                if(dist[rr][cc] >dis)
                                    {
                                    dist[rr][cc]=dis;
                                    v.push_back(make_pair<int,int>(rr,cc));
                                    }
                            }
                    }
                }
        }

for(int i=1;i<=n;i++)
    {
    for(int j=1;j<=m;j++)
        {
        printf("%d ",dist[i][j]);
        }
    printf("\n");
    }

}   // end of test case

}

当我提交这个时,我得到了超过时间限制&#34;作为我的结果。但是,在ideone it gives the correct result in 0s上。

我的第二个解决方案使用std::queue

#include<bits/stdc++.h>
using namespace std;
#define inf 10000000
typedef pair<int,int> pii;

int main()
{
int t,n,m;
cin>>t;
char str[200][200];
int dist[200][200];
while(t--)
    {
    cin>>n>>m;
    for(int i=0;i<n;i++) 
        scanf("%s",str[i]);

    set< pii > ms;
    for(int i=0;i<n;i++)
        {
        for(int j=0;j<m;j++)
            {
            if(str[i][j]=='1') 
                { dist[i+1][j+1]=0;   ms.insert( make_pair<int,int> (i+1,j+1));  }
            else 
                dist[i+1][j+1]=inf;
            }
        }
    int dis=0,rr,cc,p,q;
    pii pi,temp;
    pii nei[5];

    while(ms.empty()==0)   // bfs 
        {
            pi=*ms.begin();
            p=pi.first;
            q=pi.second;
            ms.erase(ms.begin());

            queue< pii > v;
            v.push(make_pair<int,int>(p,q));

                while(!v.empty())
                {
                    temp = v.front();
                    v.pop();

                    nei[1].first=temp.first-1; nei[1].second=temp.second;
                    nei[2].first=temp.first+1; nei[2].second=temp.second;
                    nei[3].first=temp.first;   nei[3].second=temp.second+1;
                    nei[4].first=temp.first;   nei[4].second=temp.second-1;

                    for(int i = 1; i<=4; ++i)
                    {
                        rr=nei[i].first;  
                        cc=nei[i].second;

                        if(rr>=1 && rr<=n && cc>=1 && cc<=m )
                            {
                                dis=abs(rr-p) + abs(cc-q);

                                if(dist[rr][cc] >dis)
                                    {
                                    dist[rr][cc]=dis;
                                    v.push(make_pair<int,int>(rr,cc));
                                    }
                            }
                    }
                }
        }

for(int i=1;i<=n;i++)
    {
    for(int j=1;j<=m;j++)
        {
        printf("%d ",dist[i][j]);
        }
    printf("\n");
    }

}   // end of test case

}

此解决方案也produces the correct answer in 0s on ideone并在spoj.com上被接受。

在这两种情况下,容器都像&#34;标准队列数据结构&#34;,无论是std::vector还是std::queue。任何人都可以解释为什么第一个可能被拒绝,因为太慢而第二个被接受了吗?

1 个答案:

答案 0 :(得分:1)

如果您需要队列,请使用队列。

在使用向量&lt;&gt;的实现中,您在每次迭代时手动擦除向量的第一个元素,对向量执行代价高昂的操作(导致可能重新分配整个缓冲区),但不在队列上(设计)特别是对于这种类型的操作_前后修改)。

这解释了为什么基于矢量的实现速度较慢。