C++ 向量<;向量<;T>&燃气轮机;VST[][]?

C++ 向量<;向量<;T>&燃气轮机;VST[][]?,c++,arrays,vector,C++,Arrays,Vector,我有一个代码,使用2D数组而不是向量,速度几乎快7-8倍 我只是添加了更多的文本,因为它要求我使它冗长 据我所知,向量保持指针,2D数组在编译时分解为1D数组。和内存地址在编译时解析。但我不确定为什么会有这么大的差异 #包括 #包括 #包括 #包括 使用名称空间std; //定义STL的使用 #ifdef STL_使用 字符串s;//运行时间:运行时间:8304ms 向量vis(7,向量(7,假)); #否则 chars[50]={0}; bool-vis[7][7]={0};//运行时间:运行

我有一个代码,使用2D数组而不是向量,速度几乎快7-8倍

我只是添加了更多的文本,因为它要求我使它冗长

据我所知,向量保持指针,2D数组在编译时分解为1D数组。和内存地址在编译时解析。但我不确定为什么会有这么大的差异

#包括
#包括
#包括
#包括
使用名称空间std;
//定义STL的使用
#ifdef STL_使用
字符串s;//运行时间:运行时间:8304ms
向量vis(7,向量(7,假));
#否则
chars[50]={0};
bool-vis[7][7]={0};//运行时间:运行时间:1173ms
#恩迪夫
/*
输入:????????????????????????????????????????????????
*/
整数搜索(整数id、整数i、整数j、字符ch){
vis[i][j]=真;
如果(i==6&&j==0){
返回(id==48);
}
布尔U,D,R,L;
U=D=R=L=false;
if(j!=0&&ch!=“R”)L=!vis[i][j-1];//检查左移是否可用
if(j!=6&&ch!='L')R=!vis[i][j+1];//检查右移是否可用
if(i!=0&&ch!='D')U=!vis[i-1][j];//检查上移是否可用
if(i!=6&&ch!='U')D=!vis[i+1][j];//检查下移是否可用
if(!R&&!L&&U&&D)| |(R&&L&&!D&&U))返回0;//放弃移动中的拆分。
int ans=0;
如果((s[id]='?'| s[id]='L')&&L)ans+=搜索(id+1,i,j-1,'L'),vis[i][j-1]=假;
如果((s[id]='?'| s[id]='R')&&R)ans+=搜索(id+1,i,j+1,'R'),vis[i][j+1]=假;
如果((s[id]='?'| s[id]='D')&D)ans+=search(id+1,i+1,j,'D'),vis[i+1][j]=false;
如果((s[id]='?'| s[id]='U')&&U)ans+=search(id+1,i-1,j,'U'),vis[i-1][j]=false;
返回ans;
}
void solve(){
cin>>s;
cout>检验;
对于(int t=1;t
据我所知,
vector
在编译时将2D数组分解为1D数组的位置保留指针

差不多。请记住,外部向量的7个元素中的每一个都只是指向存储在别处的其他向量的指针。所有这些间接操作都会毒害CPU缓存,更不用说7个不必要的动态分配和取消分配了

最好使用一个大小为7×7的
向量
。您必须将2D索引伪造到该数据缓冲区中,但这很容易(i=7×y+x)。将所有
布尔
放在一个相邻的位置是值得的,因为它们与数组一样

此外,不要忘记启用“优化”(例如,
-O2
)来构建,以避免
操作员[]
呼叫等不必要的低效(尽管这是固定的开销,不是规模问题)

  • vector
    是一个错误。他们早就决定将其打包。这使得它实际上与“容器”的概念不匹配,并引起了各地的头痛


  • 一个
    vector
    vector
    是出了名的慢,因为它在内部进行打包。你的理解似乎不正确。不管你说的“vector-keep-pointer,其中2D数组在编译时分解为1D数组”没有类似的事情发生。<代码> STD::数组将是一个更精确的比较。@ AsHeDeSimSH C++是用优化编译的。它的许多特性(如代码> STD::向量< /代码>)引入一些开销,这些开销预计在编译过程中可以消除,但这需要允许编译器优化这些开销。比较未优化的生成的性能通常没有意义。@因此,保留所有带有双下划线的标识符。另一个问题是
     vector
    专门化。您至少应该在回答中提到这一点。这是性能问题的一大根源。特别是对于
    std::vector,还有一个额外的问题,因为它将8个元素打包到一个字节中。它对访问单个元素有重大影响,即使它们是连续的。
    operator[]
    返回一个代理对象,该对象需要间接寻址和位移位才能真正读写任何内容。压缩布尔的位移位不会导致OP报告的7-8x性能问题。这几乎都来自向量对象的交错数组。@FrançoisAndrieux我倾向于忽略这一点,因为这是一个固定的开销,坦率地说,我会忽略不要像一些人那样对std::vector的货运崇拜深恶痛绝,尽管我承认,在这样的规模下,它可能会变得引人注目,而且考虑到OP的访问模式,它可能会成为瓶颈。我真诚地怀疑,经过优化的成品程序是否会与代理对象产生任何不良的间接影响OU.<代码> STD::数组 AHH,没有什么像C++标准库,简单的概念容易编写。