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

时间:2019-01-31 10:07:20

标签: c++ stl iterator

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

得到答案后,我意识到这是因为我实际上并没有在int上进行迭代,而是在自定义数据结构模板T上进行了迭代,因此以后进行编辑可能会更容易了解。

std::vector <T> vec;

现在有两种常见的方法可以对其进行迭代。

1。

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

2。

for(T t: vec)
{
    /* std::cout << t; ... */
}

现在,我一直认为这两种方法在后台基本相同,并且应该具有相似的运行时,但是最近在关于hackerearth的竞赛中,第二种方法(我通常的Goto)在最后一个测试用例上给了TLE,仅仅通过切换到第一种方法,我设法使所有案例都通过了,我是否错过了一些区分它们的东西,或者这只是一个巧合(因为它们的运行时间之间的实际差异是微小的,仅在极限的另一侧)。我什么都找不到,所以如果您有任何链接或见解,请分享。

1 个答案:

答案 0 :(得分:6)

这会将变量从矢量复制到t:

for(int t: vec)
{
    /* std::cout << t; ... */
}

对于int,我认为这没有太大区别。

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

for(int& t: vec)
{
    /* std::cout << t; ... */
}

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