迭代向量和其他stl容器的样式之间的差异

ana*_*ngh 0 c++ iterator stl

假设有一个stl容器,为了简单起见,我将使用一个声明为的向量

在得到答案后,我意识到这是因为我实际上并没有迭代,int而是一个自定义数据结构模板T,只是进行编辑,以便将来有人可能会发现它更容易理解.

std::vector <T> vec;

现在有两种常用的方法来迭代它.

1.

for(std::vector<T>::iterator it = vec.begin(); it != vec.end(); ++it)
{
    /* std::cout << *it; ... */
}
Run Code Online (Sandbox Code Playgroud)

2.

for(T t: vec)
{
    /* std::cout << t; ... */
}
Run Code Online (Sandbox Code Playgroud)

现在我总是假设这两种方法在引擎盖下或多或少相同并且应该具有相似的运行时间,但是最近在hackerearth的竞争中,第二个(我通常的Goto)在最后一个测试用例上给出了TLE并且只是通过切换第一种方法我设法让所有的情况都通过,我错过了区分它们的东西,或者只是巧合(因为它们的运行时间之间的实际差异很小,只是在极限的不同侧).我找不到任何东西,所以如果您有任何链接或见解请分享.

Rob*_*juk 6

这会将变量的副本从向量转换为t:

for(int t: vec)
{
    /* std::cout << t; ... */
}
Run Code Online (Sandbox Code Playgroud)

对于int我来说,我认为这不会有太大的不同.

但是如果你正在使用带有复制构造函数的类,...你可以尝试使用引用:

for(int& t: vec)
{
    /* std::cout << t; ... */
}
Run Code Online (Sandbox Code Playgroud)

如果它不修改变量,请使用a const int&