标签: c++

访客模式解释

所以我已经阅读了有关访客模式的所有文档,我仍然非常困惑.我从另一个问题中得到了这个例子,有人能帮我理解吗?例如,我们何时使用访客设计模式?我想我可能已经理解了一些,但我只是无法看到更大的图景.我如何知道何时可以使用它?

class equipmentVisited
{
  virtual void accept(equipmentVisitor* visitor) = 0;
}

class floppyDisk : public equipmentVisited
{
  virtual void accept(equipmentVisitor* visitor);
}

class processor : public equipmentVisited
{
  virtual void accept(equipmentVisitor* visitor);
}

class computer : public equipmentVisited
{
  virtual void accept(equipmentVisitor* visitor);
}

class equipmentVisitor
{
  virtual void visitFloppyDisk(floppyDisk* );
  virtual void visitProcessor(processor* );
  virtual void visitComputer(computer* );
}

// Some additional classes inheriting from equipmentVisitor would be here

equipmentVisited* visited;
equipmentVisitor* visitor;

// Here you initialise visited and …
Run Code Online (Sandbox Code Playgroud)

c++ visitor

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

std :: list :: splice和其他列表容器的复杂性

我有一些代码处理各种std :: list对象,我目前正在使用一种非常低效的方法在它们之间传输内容(我正在迭代一个列表的任意部分,并逐个将元素移动到第二个列表).我之前写过这段代码之前我才知道std :: list :: splice函数,我现在打算用我的代码替换它,例如:

list<string> list1, list2;

list1.push_back("a");
list1.push_back("b");
list1.push_back("c"); // list1: "a", "b", "c"

list<string>::iterator iterator1 = list1.begin();
iterator1++: // points to "b"

list2.push_back("x");
list2.push_back("y");
list2.push_back("z"); // list2: "x", "y", "z"

list<string>::iterator iterator2 = list2.begin();
iterator2++; // points to "y"

list1.splice(iterator1, list2, iterator2, list2.end());

// list1: "a", "y", "z", "b", "c"
// list2: "x"
Run Code Online (Sandbox Code Playgroud)

我有一个关于拼接功能复杂性的问题.根据这个消息来源:

http://www.cplusplus.com/reference/stl/list/splice/

它应该在拼接的第一个和最后一个元素之间的范围内具有线性复杂度(在我的示例中为iterator2和list2.end()),并且源表明这是因为迭代器前进.我可以忍受这个,但我一直希望不断复杂.

我的假设(在我找到此源之前)是splice函数执行如下操作:

  1. 切断"x"和"y"之间的链接
  2. 切断"z"和list2.end()之间的链接
  3. 形成"x"和list2.end()之间的链接
  4. 断开"a"和"b"之间的联系
  5. 形成"a"和"y"之间的联系
  6. 在"y"和"b"之间形成一个链接

从而恢复两个列表以完成链.

然后,相同的原则将适用于任意大小的列表.我不确定我看到哪里需要splice函数来推进任何迭代器,因为我为它提供了完成它所需要的所有迭代器.

所以我的问题是,C++规范如何解决这个问题?它是否仅在接头的起点和终点处断开并重新形成链路,还是逐个通过每个链路前进?如果是后者,那么任何其他列表容器(例如来自QT)是否提供前者?我的代码驻留在模拟程序的内部循环中,因此赋予它恒定而不是线性复杂性将是非常有价值的.

c++ qt list std

25
推荐指数
1
解决办法
4066
查看次数

奇怪的算术错误 - 255x256x256x256 = 18446744073692774400

我在c ++下编程时遇到了一件奇怪的事情.这是一个简单的乘法.

码:

unsigned __int64 a1 = 255*256*256*256;
unsigned __int64 a2= 255 << 24; // same as the above

cerr()<<"a1 is:"<<a1;
cerr()<<"a2 is:"<<a2;
Run Code Online (Sandbox Code Playgroud)

有趣的是结果是:

a1 is: 18446744073692774400 
a2 is: 18446744073692774400 
Run Code Online (Sandbox Code Playgroud)

而它应该是:(使用计算器确认)

4278190080
Run Code Online (Sandbox Code Playgroud)

谁能告诉我怎么可能呢?

c++ multiplication uint64

25
推荐指数
3
解决办法
2751
查看次数

通过索引获取__m128的成员?

我有一些代码,最初是由MSVC工作人员给我的,我正试图让它在Clang上工作.这是我遇到麻烦的功能:

float vectorGetByIndex( __m128 V, unsigned int i )
{
    assert( i <= 3 );
    return V.m128_f32[i];
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误如下:

Member reference has base type '__m128' is not a structure or union.
Run Code Online (Sandbox Code Playgroud)

我环顾四周,发现Clang(也许是GCC)在将__m128视为结构或联合时遇到了问题.但是我还没有找到一个直接的答案,我怎么能得到这些价值.我已经尝试过使用下标运算符而无法做到这一点,我已经浏览了大量的SSE内在函数列表并且尚未找到合适的函数.

c++ sse simd clang intrinsics

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

初始化程序列表在Visual Studio 2012中无法使用向量?

可能重复:
Visual Studio 2012中的C++ 11功能

所以我今天通过维基百科阅读了C++ 11初始化列表,并看到C++ 11支持标准容器的以下语法:

std::vector<std::string> v = { "xyzzy", "plugh", "abracadabra" };
std::vector<std::string> v({ "xyzzy", "plugh", "abracadabra" });
std::vector<std::string> v{ "xyzzy", "plugh", "abracadabra" }; 
Run Code Online (Sandbox Code Playgroud)

当我在Visual Studio 2012中尝试以下操作时,我收到编译错误 C2552: 'vecs' : non-aggregates cannot be initialized with initializer list

这是我的代码:

#include <vector>

using namespace std;

int main() {
    vector<string> vecs = {"h", "g", "e"};
}
Run Code Online (Sandbox Code Playgroud)

VS2012不支持初始化列表,还是我只是误解了什么?

谢谢!

c++ visual-c++ c++11 visual-studio-2012

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

如何复制2个字符串数据类型的字符串

如何复制2个字符串(这里我的意思是字符串数据类型).我使用了strcpy函数,它只适用于

char a[7]="text";
char b[5]="image";
strcpy(a,b);
Run Code Online (Sandbox Code Playgroud)

但每当我使用时

string a="text";
string b="image";
strcpy(a,b);
Run Code Online (Sandbox Code Playgroud)

我收到这个错误

functions.cpp没有匹配函数来调用`strcpy(std :: string&,std :: string&)

c++ string

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

C++:可以优化未使用的lambda显式捕获吗?

我有相当数量的代码,它依赖于捕获shared_from_this()当使用lambda表达式作为回调时确保我的实例保持活动状态:

std::shared_ptr<Thing> self = shared_from_this();
auto doSomething = [this, self] ()
{
    // various statements, none of which reference self, but do use this
}
Run Code Online (Sandbox Code Playgroud)

所以问题是:由于我没有self在lambda体内引用,是否允许一致的编译器优化捕获?


考虑以下程序:

#include <functional>
#include <iostream>
#include <memory>

std::function<void ()> gFunc;

struct S : std::enable_shared_from_this<S>
{
    void putGlobal()
    {
        auto self = shared_from_this();
        gFunc = [self] { };
    }
};

int main()
{
    auto x = std::make_shared<S>();
    std::cout << x.use_count() << std::endl;
    x->putGlobal();
    std::cout << x.use_count() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

输出是:

1 …
Run Code Online (Sandbox Code Playgroud)

c++ lambda language-lawyer c++11

25
推荐指数
1
解决办法
2141
查看次数

为使用OpenCV的C++代码编写Python绑定

我正在尝试为一些使用OpenCV的C++代码编写一个python包装器,但是我很难将结果(一个OpenCV C++ Mat对象)返回给python解释器.

我查看了OpenCV的源代码,发现文件cv2.cpp具有转换函数,可以在PyObject*和OpenCV的Mat之间来回执行转换.我使用了那些转换函数,但在我尝试使用它们时遇到了分段错误.

我基本上需要一些关于如何使用OpenCV来连接python和C++代码的建议/示例代码/在线参考,特别是能够将OpenCV的C++ Mat返回给python解释器,或者可能建议如何/从何处开始调查原因分段错误.

目前我正在使用Boost Python来包装代码.

在此先感谢任何回复.

相关代码:

// This is the function that is giving the segmentation fault.
PyObject* ABC::doSomething(PyObject* image)
{
    Mat m;
    pyopencv_to(image, m);  // This line gives segmentation fault.

    // Some code to create cppObj from CPP library that uses OpenCV
    cv::Mat processedImage = cppObj->align(m);

    return pyopencv_from(processedImage);
}
Run Code Online (Sandbox Code Playgroud)

从OpenCV的源代码转换函数如下.转换代码在带有"if(!PyArray_Check(o))..."的注释行中给出了分段错误.

static int pyopencv_to(const PyObject* o, Mat& m, const char* name = "<unknown>", bool allowND=true)
{
    if(!o || o == Py_None)
    {
        if( !m.data )
            m.allocator …
Run Code Online (Sandbox Code Playgroud)

c++ python boost opencv boost-python

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

用C++编写的高质量开源文本到语音(TTS)引擎

我正在寻找用C++编写的开源文本到语音(TTS)引擎.理想情况下,只要信息源是免费提供的,高质量的声音(参见下面的质量定义),但也可以选择质量较低的替代品.

这样的开源项目是否存在?

"高质量"是指"人类听觉","非机器人",最终结果大致与这两个英语语言示例相同:示例1,示例2

c++ text-to-speech

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

我还应该在C++ 11中返回const对象吗?

可能重复:
我应该返回const对象吗?
(该问题的原始标题是:int foo()或const int foo()?解释为什么我错过了它.)


有效的C++,第3项:尽可能使用const.特别是,返回const对象被提升以避免意外的赋值if (a*b = c) {.我发现它有点偏执,但我一直在遵循这个建议.

在我看来,返回const对象会降低C++ 11中的性能.

#include <iostream>
using namespace std;

class C {
public:
    C() : v(nullptr) { }

    C& operator=(const C& other) {
        cout << "copy" << endl;
        // copy contents of v[]
        return *this;
    }

    C& operator=(C&& other) {
        cout << "move" << endl;
        v = other.v, other.v = nullptr;
        return *this;
    }

private:
    int* v;
};

const C const_is_returned() { return C(); }

C nonconst_is_returned() …
Run Code Online (Sandbox Code Playgroud)

c++ performance const c++11

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