访问C ++容器中元素的最有效方法是什么?

时间:2014-08-01 13:25:03

标签: c++

假设我想依次访问C ++容器中的所有元素,哪种方式最有效?我在下面的例子中说明了我的问题:

std::vector<int> abc;
abc.push_back(3);
abc.push_back(4);
...
...

for(int i=0; i<abc.size(); i++)
{
  abc[i];
}

std::vector<int>::iterator it = abc.begin();
std::vector<int>::iterator itEnd = abc.end();
while(it != itEnd)
{
     (*it);
     it++;
}

在这个例子中,正如您所看到的,两个方法用于访问C ++容器中的元素,因此一个自然的问题是哪一个更有效。感谢。

1 个答案:

答案 0 :(得分:6)

最好的办法就是做一些像100万个循环一样的东西并进行测试。编译器各不相同。确保在发布模式下进行测试。

我使用ACE,但这里是我如何获得时差的一个例子。

  // Log how long each module takes.
      ACE_Time_Value    lSendStart;
      ACE_Time_Value    lDifference;

       // Start keeping track of how long this takes
      lSendStart = ACE_OS::gettimeofday();

      // Figure out how long we took.
      lDifference = ACE_OS::gettimeofday() - lSendStart;
       // Log how long we took
      PLALOG_INFO( mLogger, ACE_TEXT( "doProcessing took ") <<lDifference.sec () << ACE_TEXT( "seconds(s) and ") << (lDifference.usec ()) <<
                    ACE_TEXT(" micro second(s) to process." ), "" );

因此,获取开始时间,循环一百万次,获得差异,然后以相反的方式执行相同的循环。

我发现的另一件事,如果你可以使用c ++ 11中的auto,你通常会找到一个更快的循环,然后就像你所展示的那样,找到历史悠久的for循环。

   std::vector<std::string> lNameList; 
   // fill in vector
   for(auto& lSection : lNameList)
   {
      // lSection is not a string
      // DO something with it

   }