小编for*_*idt的帖子

list :: size()真的是O(n)吗?

最近,我注意到有些人提到它std::list::size()具有线性复杂性.
根据一些 消息来源,这实际上是依赖于实现的,因为标准没有说复杂性必须是什么.此博客条目中
的评论说:

实际上,这取决于您使用的STL.Microsoft Visual Studio V6将size()实现为{return(_Size); 而gcc(至少在版本3.3.2和4.1.0中)将其作为{return std :: distance(begin(),end()); 第一个具有恒定速度,第二个具有o(N)速度

  1. 所以我的猜测是因为VC++人群的size()复杂程度不变,因为自VC6以来Dinkumware可能不会改变这一事实.我在那儿吗?
  2. 目前看起来像gcc什么?如果它真的是O(n),开发人员为什么选择这样做?

c++ complexity-theory big-o stl list

61
推荐指数
5
解决办法
2万
查看次数

如何找到任何整数的10的下一个倍数?

动态整数将是0到150之间的任何数字.

即 - 数字返回41,需要返回50.如果数字是10则需要返回10.数字是1需要返回10.

如果我将整数修改为小数,我以为我可以使用天花板功能......?然后使用天花板功能,并回到十进制?
唯一的事情也是必须知道这个数字是1,2或3位数(即-7 vs 94 vs 136)

有没有更好的方法来实现这一目标?

谢谢,

c algorithm math

42
推荐指数
5
解决办法
4万
查看次数

我应该优化还是让编译器这样做?

根据效率编写循环的首选方法是什么:方式a)

   /*here I'm hoping that compiler will optimize this  
 code and won't be calling size every time it iterates through this loop*/
    for (unsigned i = firstString.size(); i < anotherString.size(), ++i)
    {
    //do something
    }
Run Code Online (Sandbox Code Playgroud)

或者我应该这样做:方式b)

unsigned first = firstString.size();
unsigned second = anotherString.size();
Run Code Online (Sandbox Code Playgroud)

现在我可以写:

    for (unsigned i = first; i < second, ++i)
    {
    //do something
    }
Run Code Online (Sandbox Code Playgroud)

第二种方式在我看来更糟糕的选择有两个原因:范围污染和冗长,但它的优点是确保每个对象都会调用一次size().
期待您的回答.

c++ optimization performance

25
推荐指数
5
解决办法
1521
查看次数

语言比C++更快

据说Blitz ++提供了近Fortran性能.

对于等效任务,Fortran实际上往往比常规C++更快吗?

那些具有出色运行时性能的其他HL语言呢?我听说过几种语言在某些任务中使用C++ ... Objective Caml,Java,D ...

我猜GC可以更快地编写代码,因为它不需要在堆栈周围进行过多的复制?(假设代码不是为了性能编写的)

我是出于好奇而问 - 我一直认为C++几乎是无与伦比的专家ASM编码.

c++ performance programming-languages

21
推荐指数
4
解决办法
2万
查看次数

将const引用传递给基本类型有什么用?

在我维护的项目中,我看到很多代码都是这样的简单get/ set方法

const int & MyClass::getFoo() { return m_foo; }

void MyClass::setFoo(const int & foo) { m_foo = foo; }
Run Code Online (Sandbox Code Playgroud)

这样做有什么意义而不是以下几点?

int MyClass::getFoo() { return m_foo; }  // Removed 'const' and '&' 

void MyClass::setFoo(const int foo) { m_foo = foo; }  // Removed '&'
Run Code Online (Sandbox Code Playgroud)

传递对基本类型的引用应该需要与传递类型的值本身相同(或更多)的努力,对吧?
毕竟这只是一个数字......
这只是一些尝试的微观优化还是有真正的好处?

c++ primitive const reference

15
推荐指数
3
解决办法
6894
查看次数

如何在QML中模拟鼠标点击?

我正在尝试向QMouseEvent当前显示的QML对象发送一个.将QApplication::sendEvent()始终返回false这意味着我的事件没有得到处理; 但我不明白为什么.
也许我将事件发送到错误的对象?我应该把它寄到哪里?我也玩过QGraphicsSceneMouseEvent而不是QMouseEvent但也没有运气.

我尝试使用调试器逐步调试事件代码,但是对于我来说太复杂了,看不出它为什么不起作用.

背景

我正在开发一款可以通过简单的触摸屏控制的软件.我通过以太网获得触摸事件,我想从它们合成鼠标点击事件.这样,软件将以与开发者PC上相同的方式在目标设备上进行控制.

更新

  1. 如fejd所述,点击代码之前已执行QApplication::Exec(),因此我将其移动到将在exec()运行时触发的计时器处理程序.
  2. 添加了按预期工作的特定于Windows的代码.
  3. 在Qt中添加了一些尝试,无论是sendEvent()返回true还是返回,都没有false.

到目前为止我有这个:

main.cpp中

#include <QtGui/QApplication>
#include "qmlapplicationviewer.h"

#include "clicksimulator.h"

#include <QTimer>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QmlApplicationViewer viewer;
    viewer.setOrientation(QmlApplicationViewer::ScreenOrientationAuto);
    viewer.setMainQmlFile(QLatin1String("qml/qmlClickSimulator/main.qml"));
    viewer.showMaximized();

    ClickSimulator sim(&viewer);
    QTimer timer;
    sim.connect(&timer, SIGNAL(timeout()), SLOT(click()));
    timer.start(100);

    return app.exec();
}
Run Code Online (Sandbox Code Playgroud)

clicksimulator.h

#ifndef CLICKSIMULATOR_H
#define CLICKSIMULATOR_H

#include <QObject>

class QmlApplicationViewer;

class ClickSimulator : public QObject
{ …
Run Code Online (Sandbox Code Playgroud)

mouse events qt onclick qml

14
推荐指数
1
解决办法
1万
查看次数

轻量级包装 - 这是一个常见问题,如果是,它的名字是什么?

我必须使用一个库来进行非线程安全的数据库调用.另外,我偶尔也需要在后台线程中加载大量数据.
很难说哪些库函数实际访问了数据库,因此我认为对我来说最安全的方法是用锁来保护每个库调用.

假设我有一个库对象:

dbLib::SomeObject someObject;
Run Code Online (Sandbox Code Playgroud)

现在我可以这样做:

dbLib::ErrorCode errorCode = 0;
std::list<dbLib::Item> items;
{
    DbLock dbLock;
    errorCode = someObject.someFunction(&items);
} // dbLock goes out of scope
Run Code Online (Sandbox Code Playgroud)

我想将其简化为类似的东西(甚至更简单):

dbLib::ErrorCode errorCode =
    protectedCall(someObject, &dbLib::SomeObject::someFunction(&items));
Run Code Online (Sandbox Code Playgroud)

这样做的主要优点是我不必复制接口,dbLib::SomeObject以便用锁来保护每个呼叫.

我很确定这是一个常见的模式/习语,但我不知道它的名字或搜索的关键词.(看看http://www.vincehuston.org/dp/gof_intents.html我认为,它更像是一种成语而不是一种模式).

我在哪里可以查找更多信息?

c++ design-patterns locking idioms wrapper

13
推荐指数
2
解决办法
623
查看次数

哪个强制转换更快static_cast <int>()或int()

试着看看哪个演员表更快(不是更好):新的c ++案例或旧时尚的C样式演员.有任何想法吗?

c c++ performance

9
推荐指数
1
解决办法
4180
查看次数

如何在单独的线程中创建带有进度条的MFC对话框?

我的应用程序可能需要一段时间才能连接到数据库.这个连接使用单个库函数调用,即我不能在其中放入进度更新并进行回调或类似的操作.

我的想法是在连接到数据库之前在单独的线程中创建一个带有进度条的对话框.此对话框将不断更改进度状态,CProgressCtrl::StepIt()以便用户看到正在发生的事情.
在设置完对话框并执行其操作之后,我想从主线程调用数据库连接函数.连接功能完成后,我想停止进度条线程.

让我画一幅画:

CMyApp::       ProgressThread
InitInstance()      .
    |               .
    |               .
    +-Create Dialog-+
    |               |
    |             Animate
 Connect          Progress
    to             Bar
    DB              |
    |               |
    +-Destroy Dlg---+
    |               .
    |               .
Run Code Online (Sandbox Code Playgroud)

那可能吗?如果有,怎么样?

也许整个事情也可以使用计时器.可能会简单得多,但我也无法做到这一点.

  1. 我知道CProgressCtrl::SetMarquee()哪些可能正是我需要的但我无法使用它因为应用程序没有Unicode支持.
  2. 我可以将数据库连接调用移动到一个单独的线程中,但这样看起来像代码的大量更改和连接错误的额外处理.

更新2
我得到它的方式AlexEzh和Javier De Pedro建议:将DB stuf放入自己的线程.
最初我担心如何处理错误,但它实际上与之前的情况非常相似.

  1. 在主线程中,我创建了一个带有连接参数的结构,结果标志和thread-running-flag.后者最初设定为true.
  2. 我创建一个线程并将该结构作为参数传递.
  3. 我创建了一个在主线程中显示进度条的对话框.
  4. 同样在主线程中,有一个循环在设置thread-running-flag时运行.它调用CMyDialog::Animate()哪些调用CProgressCtrl::StepIt()然后调用Sleep().
  5. 线程执行db-connection代码并false在完成时将running-flag设置为.
  6. 当主线程退出循环时,它可以完全像以前一样处理错误.

缺点:将鼠标移到窗口上不起作用.它是看不见的.因此,不能使用取消按钮或其他交互式对话元素.但是,我可以忍受这一点.

既然您喜欢这个图表,现​​在的样子如下:

CMyApp::        WorkerThread
InitInstance()      .
    |               .
    |               .
Create Dialog       .
    |               .
    +-Start Thread--+ …
Run Code Online (Sandbox Code Playgroud)

c++ mfc multithreading dialog progress-bar

9
推荐指数
2
解决办法
2万
查看次数

从函数返回整数数组

我正在尝试从函数返回一个整数数组,对数字进行排序然后将所有内容传递回main.我没有在这段代码中分配和释放内存.我只是想看看它是否真的有效.编译器标记语句的错误b=sort(a).它说它不可分配,这是有道理的.输入整数不是指针.有没有办法将整数数组声明为指针?如 :

int *a[5]={3,4}

#include <stdio.h>
#include <stdlib.h>
int *sort(int *input_array);

int *sort(int *input_array)
{
    return input_array;
}

int main()
{
    int a[5]={3,4};
    int b[5];
    b=sort(a);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c

8
推荐指数
2
解决办法
4万
查看次数