标签: stack

标准堆栈性能问题

最近我正在尝试做一些性能基准测试,比较std::stack<int, std::vector<int>>和我自己的堆栈的简单实现(使用预先分配的内存)。现在我遇到了一些奇怪的行为。

我想问的第一件事是堆栈基准代码中的这一行:

//  std::vector<int> magicVector(10);
Run Code Online (Sandbox Code Playgroud)

当我取消注释这条线时,性能提高了大约 17%(基准时间从 6.5 秒下降到 5.4 秒)。但是该行应该对程序的其余部分没有影响,因为它不会修改任何其他成员。此外,它是int的向量还是double的向量都没有关系......

我想问的第二件事是我的堆栈实现和std::stack. 有人告诉我这std::stack应该和我的堆栈一样快,但结果显示我的“FastStack”是两倍快。

结果(未注释的性能提升线):
stack 5.38979
stack 5.34406
stack 5.32404
stack 5.30519
FastStack 2.59635
FastStack 2.59204
FastStack 2.59713
FastStack 2.64814

这些结果来自 VS2010 的发布版本,带有 /O2、/Ot、/Ob2 和其他默认优化。我的 CPU 是 Intel i5 3570k,具有默认时钟(一个线程为 3.6 GHz)。

我将所有代码放在一个文件中,以便任何人都可以轻松测试它。

#define _SECURE_SCL 0

#include <iostream>
#include <vector>
#include <stack>
#include <Windows.h>

using namespace std;

//---------------------------------------------------------------------------------
//---------------------------------------------------------------------------------
//  Purpose:    High Resolution Timer
//---------------------------------------------------------------------------------

class HRTimer
{
public:
    HRTimer(); …
Run Code Online (Sandbox Code Playgroud)

c++ windows performance stack

-3
推荐指数
1
解决办法
3984
查看次数

为什么for循环不递增?

为什么我的for循环增量不?整数“ i”不会以某种方式增加,这会导致要打印出数组的第一个位置。

我执行以下操作:


int* values = new int[10] {};

int& half(int* arr[]){

  //Here, the "i" doesn't increment  

  for(int i = 0; i < 10; i++){
      return *arr[i];
  }
}

int main(){
   int& a = half(&values);
   std::cout << a << std::endl;

   delete[] values;
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ arrays heap stack

-3
推荐指数
1
解决办法
83
查看次数

在 O(1) 中设计一个堆栈 + findmin 和 deletemin?

我看到了关于在 O(1) 时间内使用 findmin 设计堆栈的问题的答案:

/sf/answers/240519891/

如果请求相同怎么办:

Devise a stack-like data structure that does push, pop and min (or max) operations 
in O(1) time. There are no space constraints.
Run Code Online (Sandbox Code Playgroud)

但deletemin也应该是O(1)?是否可以?

algorithm stack data-structures

-4
推荐指数
1
解决办法
459
查看次数

C++ STL关系运算符如何比较堆栈?

说我有两个堆栈:

stack<int> s1, s2;
Run Code Online (Sandbox Code Playgroud)

然后我在其中推送一些值:

s1.push(2);
s1.push(4);
s1.push(5);

s2.push(1);
s2.push(2);
s2.push(10);
Run Code Online (Sandbox Code Playgroud)

当我像这样比较bool isEqual = (s1 > s2);它时,它会产生True.但为什么?并非所有s1的元素都大于相应的s2元素,并且所有元素的总和也不大于s2的元素.STL数据结构之间的确切比较方法是什么.

PS我想这也适用于队列,deques,列表.

c++ stack stl data-structures

-4
推荐指数
1
解决办法
92
查看次数

来自Book的C++中的堆栈示例?

这是本书的一个例子:

template <class T>
class stack
{
public:
stack();
stack(const stack&);
stack & operator=(const stack&);
~stack();
T& top();
void push(const T&);
void pop();

//few more functions 

}
Run Code Online (Sandbox Code Playgroud)

我有以下问题:

为什么top的返回类型不是堆栈&为什么重载赋值的参数不是T&?

Rgds,Softy

c++ stack copy-constructor

-5
推荐指数
1
解决办法
700
查看次数

性能悖论:堆栈与堆分配(C++)

我昨天进行了一些性能测试,看看堆栈和堆分配在实践中有多大差异.人们对这种测试的期望是堆分配略慢或与堆栈分配相同.然而,我惊讶地发现了相反的情况.我无法解释为什么,以及它在逻辑上是如何可能的,但堆分配总是稍微快一点(我正在编译优化OFF).

这是一个示例输出:

ticks (stack): 42698
ticks (stack): 43977
ticks (stack): 44024
ticks (stack): 44070
ticks (stack): 45038

ticks (heap): 42588
ticks (heap): 43525
ticks (heap): 43633
ticks (heap): 43681
ticks (heap): 43071
Run Code Online (Sandbox Code Playgroud)

这是一个很小的差异但它非常一致,它在100%的时间内重现了堆分配.

谁能解释为什么我会得到这些奇怪的结果?

这是我运行的代码:

#include <vector>
#include <iostream>
#include <string>
#include <windows.h>

using namespace std;

struct JJ
{
    int c[50];
    JJ(int i) { c[5] = 3; c[29] = 4; c[30] = i; c[49] = c[5]; }
};

void fill_direct_stack()
{
    vector<JJ> vec;
    for (int i=0; i<1000; ++i)
        vec.push_back(i);
} …
Run Code Online (Sandbox Code Playgroud)

c++ heap performance stack

-5
推荐指数
1
解决办法
761
查看次数

为什么我们在Java中使用堆栈和队列?

我正在研究Java中数据结构的这一部分,而我仍然对如何使用它们而不是数据结构以及为什么要使用它们感到困惑。

java queue stack

-5
推荐指数
1
解决办法
3003
查看次数

我什么时候应该使用java.util.Stack vs My Own Implementation?

所以我很困惑,需要一个建议.在Java中,我可以实现自己的Stack,或者我可以使用java.util提供的Stack.

手册:

public class stack {

private int maxSize; //max size of stack
private char[] stackArray;
private int top; //index poistion of last element

public stack(int size){
    this.maxSize=size;

    this.stackArray=new char[maxSize];
    this.top=-1; //    
}


public void push(char j){

    if (isFull()) {
        System.out.println("SORRY I CANT PUSH MORE");
    }else{

    top++;
    stackArray[top]=j;
    }
}

public char pop(){

    if(isEmpty()){
        System.out.println("Sorry I cant pop more!");
        return '0';
    }else{

       int oldTop=top;
    top--;
    return stackArray[oldTop];

    }
}


public char peek(){
    if(!isEmpty()) {
        return stackArray[top];
    }
}


public boolean …
Run Code Online (Sandbox Code Playgroud)

java queue stack data-structures

-5
推荐指数
1
解决办法
870
查看次数

错误:数字常量前应有';',','或')

我正在制作一个堆栈类,并试图使其成为对象并在另一个类中使用它。但是,它提到存在错误。这是我在类中初始化堆栈对象的代码:

class functions{
public:
int m[5];
int c=0;
stack_x mem(5);
Run Code Online (Sandbox Code Playgroud)

c++ stack class

-12
推荐指数
1
解决办法
74
查看次数