小编Man*_*rse的帖子

std ::对象效率列表

假设你有一个类的std :: list.您可以通过两种方式制作此列表:1)

std::list<MyClass> myClassList;
MyClass myClass;
myClassList.push_front(myClass);
Run Code Online (Sandbox Code Playgroud)

使用此方法,将对象传递给列表时将调用复制构造函数.如果该类有许多成员变量,并且您多次进行此调用,则可能会变得昂贵.

2)

std::list<MyClass*> myClassList;
MyClass* myClass = new MyClass();
myClassList.push_front(myClass);
Run Code Online (Sandbox Code Playgroud)

此方法不会调用该类的复制构造函数.我不完全肯定在这种情况下会发生什么,但我认为该列表将创建一个新的MyClass*并分配参数的地址.事实上,如果你在堆栈而不是堆上创建myClass并让它超出范围,那么myClassList.front()是无效的,因此必须如此.

如果我错了,请反驳我,但我相信第二种方法对某些类来说效率更高.

c++ stl

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

捕获所有异常并记录信息

我是一名使用 C++ 代码的 Java 程序员,需要一些异常处理方面的帮助。

我有以下结构的代码:

try{
...
}
catch( ... ) 
{
    log("Exception occurred");
}
Run Code Online (Sandbox Code Playgroud)

发生了异常,但 try 块确实很大,而且调试不是一种选择,因此我需要最少地修改代码以提供有关异常的相关信息。

所以我在现有的 catch 块之前添加了以下 catch 块(使用我的 Java 知识并参考 C++ 指南):

catch(exception e)
{
    log(e.what());
}
Run Code Online (Sandbox Code Playgroud)

但是,我仍然收到旧消息 - “发生异常”。try 块中的代码包含许多低级函数,例如strncpy, memcpy等。

为什么这个catch块没有按预期工作?我该怎么做才能获取有关正在发生的异常以及在哪一行上的信息,类似于 Java 轻松提供的堆栈跟踪。

c++ exception-handling try-catch

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

即使没有构造类对象,为什么这个C++程序能够成功运行?

为什么即使不构造类对象,这个C++程序也能成功运行?我们来看下面的代码:

#include<iostream>

using namespace std;

class Dopey
{
  public:
    Dopey() {cout << "Dopey\n";}
};

class Bashful
{
  public:
    Bashful() { cout << "BashFul\n";}
    void f() { cout << " f \n";}
    int i;
};

class Sneezy
{
  public:
    Sneezy(int i) {cout << "copy int \n";}
    Sneezy(Bashful d) { cout << "copy Bashful\n";}
    Sneezy(Bashful* d) {d->f();d->i=100;} //How could this be correct without    
                                              //  constructing d !!!!!!!!
    Sneezy();
};

class Snow_White
{
  public:
    Snow_White();
    Dopey dopey;
    Sneezy sneezy;
    Bashful bashful;
  private:
    int …
Run Code Online (Sandbox Code Playgroud)

c++

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

订阅活动巴士

我正在尝试使用guava订阅EventBus.试图查看网站文档,但无法看到任何显示如何执行此操作的示例.

有人试过吗?

private final EventBus eventBus = new EventBus();
eventBus.post(eventId); // where eventId is a string.
Run Code Online (Sandbox Code Playgroud)

这是在其中一个罐子里.现在我需要订阅这个eventbus并检查是否有任何新的eventId已发布.我怎样才能做到这一点?

任何帮助表示赞赏.

谢谢!!

java guava

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

为什么我的SSE不比C/C++代码快?

我刚刚开始使用SSE优化我的计算机视觉项目代码,旨在检测图像中的肤色.以下是我的功能.该函数采用彩色图像并查看每个像素并返回概率图.注释掉的代码是我最初的C++实现,其余的是SSE版本.我对它们进行了计时,并且发现SSE并不比我原来的C++代码快得多.有关正在发生的事情或如何进一步优化功能的任何建议?

void EvalSkinProb(const Mat& cvmColorImg, Mat& cvmProb)
{
    std::clock_t ts = std::clock();  
    Mat cvmHSV = Mat::zeros(cvmColorImg.rows, cvmColorImg.cols, CV_8UC3);
    cvtColor(cvmColorImg, cvmHSV, CV_BGR2HSV);
    std::clock_t te1 = std::clock(); 

    float fFG, fBG;
    double dp;

    __declspec(align(16)) int frgb[4] = {0};
    __declspec(align(16)) int fBase[4] = {g_iLowHue, g_iLowSat, g_iLowVal, 0};
    __declspec(align(16)) int fIndx[4] = {0};
    __m128i* pSrc1 = (__m128i*) frgb;
    __m128i* pSrc2 = (__m128i*) fBase;
    __m128i* pDest = (__m128i*) fIndx;
    __m128i m1;

    for (int y = 0; y < cvmColorImg.rows; y++)
    {
        for (int x = 0; …
Run Code Online (Sandbox Code Playgroud)

c++ opencv sse

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

如何等到互斥锁解锁?

有一系列互斥体.我的功能:

  1. 检查是互斥锁被锁定

2A.如果没有,那么锁定它

2B.如果已锁定,请等待解锁并锁定它

另一个功能解锁它.

问题是我在等待部分遇到了崩溃:

HANDLE mutexes[N];

void func(int i)
{
  // (*) wait until unlocked or create if unlocked
  while ((mutexes[i] = CreateMutex(NULL, TRUE/*same with FALSE*/, NULL)) != NULL);
  /*or WaitForSingleObject(mutexes[i], INFINITE)*/

  mutexes[i] = CreateMutex(NULL, TRUE, NULL);
}
Run Code Online (Sandbox Code Playgroud)

在(*)点,我遇到了崩溃 - 访问冲突.当它试图创建之前已经创建的互斥锁[i]时发生崩溃.我不能使用WaitForSingleObject,因为第一次没有创建互斥锁[i],文档说WaitForSingleObject未定义.此外,如果我使用此功能,我会得到同样的崩溃.

我只需要这种简单伪代码的模拟

if (mutex_has_been_created[mutexes[i]])
  WaitUntilRelease()
CreateMutex();
Run Code Online (Sandbox Code Playgroud)

我试图将它包装在一个关键部分并获得相同的结果.我确信这i是在正确的范围内.我不能使用Boost/pThreads/etc.

我知道我的问题很简单,但我找不到解决方案.在所有示例中,我都看到过之前创建了一个互斥锁WaitForSingleObject,这对我来说不起作用.

谢谢.

c++ winapi multithreading

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

printf在使用%.22f时更改值

我有基本类型转换的问题.

#include<stdio.h>

int main()
{
     printf("%.22f",0.30);
     return 1;
}
Run Code Online (Sandbox Code Playgroud)

我得到的输出是0.2999999999999999888978

为什么0.3转换为较小的值

任何帮助非常感谢

Nandish

c c++ type-conversion

2
推荐指数
1
解决办法
151
查看次数

如何在for循环中使用指针来计算字符?

我正在浏览论坛,看到一个关于计算字符串中每个字母数的问题.我正在自学并做了一些研究,现在开始做项目了.这里我打印了数组的元素.但我这样做没有指针.我知道我可以使用指向数组的指针并为每个值增加它,但我需要一些帮助.

这是我没有指针的代码:

code main() {
    char alph [] = {'a', 'b', 'c'};
    int i, o;
    o = 0;
    for(i=0; i < 3; i++)
        { cout << alph[i] << ' '; };
};
Run Code Online (Sandbox Code Playgroud)

这是我的错误代码,无法使指针工作.

main() {
    char alph [] = {'a', 'b', 'c'};
    char *p;
    p = alph;

    for (; p<=3; p++);
        cout << *p;

    return 0;
};
Run Code Online (Sandbox Code Playgroud)

我希望答案不是太明显; 我不是故意浪费任何人的时间.这也是我的第一篇文章,所以如果有人想给我建议,谢谢.

c++

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

C++使用不同的代码来处理同一程序中的向量和列表的排序

我曾经typedef vector<MyDatatype> ls;只通过改变typedef定义来启用列表和向量之间的切换.除了sort函数之外,所有的工作都很好,对于向量,它实现的方式不同

void show(driver& ls)
{
    ls.sort(compare); //this line gives error
    driver::iterator iter=ls.begin();
    int i=1;
    while(iter!=ls.end())
    {
        cout<<i<<". "<<iter->name<<string(maxlength+1-(iter->name).size(),' ');
        streamsize prec=cout.precision(2);
        cout<<grade(*iter);
        cout.precision(prec);
        cout<<endl;
        i++; iter++;
    }
}
Run Code Online (Sandbox Code Playgroud)

做类似的事情:

if(typeid(ls)==typeid(list<string>)) ls.sort(compare);
else if(typeid(ls)==typeid(vector<string>)) sort(ls.begin(), ls.end(), compare);
Run Code Online (Sandbox Code Playgroud)

不会有任何好处.所以我的问题是:是否可以测试类型并相应地使用合适的排序函数,或者我是否必须编写自己的排序函数(或者可能将向量转换为列表)?我找不到任何相关的帖子.

c++ sorting list vector

2
推荐指数
1
解决办法
156
查看次数

将std :: any转换为未知类型

如果我有std::any一个std::string或一个int,我怎么能投清楚交代包含的类型呢?

std::anytype它,但我不能使用这种类型来施放.

例:

#include <any>
#include <iostream>
#include <string>

int main(void) {
    std::any test = "things";
    std::any test2 = 123;

    // These don't work
    std::string the_value = (std::string) test;
    int the_value2 = (int) test2;

    std::cout << the_value << std::endl;
    std::cout << the_value2 << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

c++ c++17

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