使用迭代器时的性能问题?

hel*_*922 2 c++ c++11

我有一个函数,它接收一个字符列表并生成下一个字典排列.为了好玩,我尝试将代码概括为使用迭代器,以及能够生成更多不同类型的排列.

template<typename ITER>
bool nextPermutation(ITER start, ITER end, std::random_access_iterator_tag)
{
    for(ITER i = end-1; i != start; --i)
    {
        if(*(i-1) < *i)
        {
            // found where can be swapped
            for(ITER j = end-1; j != (i-1); --j)
            {
                if(*(i-1) < *j)
                {
                    // found what to swap with
                    auto temp = *j;
                    *j = *(i-1);
                    *(i-1) = temp;
                    // put everything from i on into "sorted" order by reversing
                    for(ITER k = end-1; k > i; --k,++i)
                    {
                        temp = *k;
                        *k = *i;
                        *i = temp;
                    }
                    return true;
                }
            }
        }
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

但是,我遇到的问题是,当我不使用原始指针时,代码的性能明显变慢.这是我的测试台:

template<typename ITER>
bool nextPermutation(ITER start, ITER end, std::random_access_iterator_tag);

template<typename ITER>
bool nextPermutation(ITER start, ITER end)
{
    return nextPermutation(start, end, std::iterator_traits<ITER>::iterator_category());
}

#define USE_VECTOR

int main(void)
{
    bool hasNext = true;
#ifdef USE_VECTOR
    std::vector<char> c;
    for(char i = '0'; i <= '9'; ++i)
    {
        c.push_back(i);
    }
    for(size_t i = 0; i < 999999 && hasNext; ++i)
    {
        hasNext = nextPermutation(c.begin(), c.end());
    }
#else
    char c[] = "0123456789";
    size_t LENGTH = 10;
    for(size_t i = 0; i < 999999 && hasNext; ++i)
    {
        hasNext = nextPermutation(c, c+LENGTH);
    }
#endif
    std::cout << "done" << std::endl;
    std::cin.ignore();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

何时USE_VECTOR定义,运行此测试装置需要大约20秒.当我取消定义它时,代码运行不到一秒钟(我没有写任何定时代码,但足以说明性能有非常显着的差异).

现在我的问题是我在哪里采取如此巨大的性能影响,这将影响使用迭代器(std :: string iterator,std :: vector iterator等)与原始指针?

Xeo*_*Xeo 7

没有优化,由于迭代器调试繁重(_ITERATOR_DEBUG_LEVEL在调试模式下默认为2,即完全调试),代码在我的机器上也很慢.
随着/02然而,迭代器调试已完全被禁用和代码执行满之前控制台窗口甚至出现了.
在这里,您有一个调试使事情变得更慢但更安全的一个很好的例子.:)