小编Zie*_*ezi的帖子

为什么必须定义未使用的虚函数?

我发现很遗憾,与未使用的普通函数不同,仍然必须定义未使用的虚函数.我对在创建类对象时创建的隐式vtablevpointer有所了解- 这有点回答了问题(必须定义函数以便可以定义指向虚函数的指针)但这会进一步推动我的查询仍然.

如果根本不可能调用虚函数,为什么需要为函数创建vtable条目?

class A{
    virtual bool test() const;
};

int main(){
    A a; //error: undefined reference to 'vtable for A'
}
Run Code Online (Sandbox Code Playgroud)

虽然我声明A::test()它从未在程序中使用但它仍然会引发错误.编译器是否可以不通过程序运行并且实现test()从未被调用 - 因此不需要vtable条目?或者这对编译器来说是不合理的事情?

c++ virtual function definition

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

K&R 2第5.10节的澄清

如果输入是模式,则模式识别程序必须打印包含模式的所有行.如果输入是find -x pattern,则程序必须打印除包含pattern的行以外的所有行.

// .....
switch(c)
{
case 'x':
    except=1;
    break;
// ......
}

// ......
while(getline(line,MAXLINE)>0)
    {
    line_num++;
    if( (strstr(line,*argv)!=NULL) != except)
        {
        if(number)
            printf("%ld:",linenum);
        printf("%s",line);
        found++;
        }
    }
// ......
Run Code Online (Sandbox Code Playgroud)

在上面的代码来自K&R,除了可以是1或0. if(strstr...)块函数如何有效地处理-x?

c kernighan-and-ritchie

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

C++中的数值积分

我需要集成一个函数(两个变量).我知道我可以通过使用Fubini定理来集成一个变量函数,然后使用数值方法,如Rectangle方法梯形规则.

但是在C++中有没有预先构建的函数呢?我需要整合单位R2三角形((0,0), (1,0), (0,1)).

c++ integration numerical

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

低内存消耗的C ++本征求解器

我是C ++编程的新手,但我有一个任务是为尺寸很大的矩阵计算对称矩阵(和Hermitian)的特征值和特征向量(标准本征问题Ax = lx)):Binomial(L,L / 2)其中L大约是18-22岁。现在,我正在具有7.7 GB可用内存的机器上对其进行测试,但最终我将可以访问具有64GB RAM的PC。

我从Lapack ++开始。一开始,我的项目假设仅针对对称实矩阵解决此问题。

这个图书馆很棒。非常快速且占用少量RAM。它具有计算特征向量并将其放置在输入矩阵A中的选项,以节省内存。有用!我以为Lapack ++ eigensolver可以处理Hermitian矩阵,但是由于未知的原因而不能(也许我做错了)。我的项目不断发展,对于埃尔米特矩阵,我也应该能够计算出这个问题。

因此,我尝试将库更改为Armadillo库。它可以正常工作,但是不如Lapack ++取代mat Aall eigenvec,但它当然支持埃尔米特矩阵。

L = 14的一些统计

  • Lapack ++ RAM 126MB时间7.9s本征+本征向量

  • 犰狳 RAM 216MB时间12s本征

  • Armadillo RAM 396MB时间15s本征值+本征向量

让我们做一些计算:double变量大约是8B。我的矩阵的大小为 binomial(14,7)= 3432,因此在理想情况下它应具有3432 ^ 2 * 8/1024 ^ 2 = 89 MB

我的问题是:是否可以修改或强制ArmadilloLapack ++一样做一个不错的技巧?犰狳的用法LAPACKBLAS例程。或者,也许有人可以推荐使用另一个库解决此问题的另一种方法? …

c++ eigenvalue eigenvector lapack++ armadillo

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

如何基于指针与非指针类型重载成员函数

鉴于以下情况:

template <typename T>
class Whatever
{
public:
    Whatever(T &&t): _t(std::move(t)) { }

private:
    T _t;
};
Run Code Online (Sandbox Code Playgroud)

何时T是指针类型,我需要检查构造函数的targ以查看它是否-1(不要求),并nullptr在将其分配给之前将其更改为a _t. 换句话说,我需要为指针类型重载此构造函数.

有谁知道这是否可行?

注意:即使我在指针类型上部分地专门化类,我希望该类在可能的情况下从上面的类本身继承(因为除了这两个类的行为是相同的),但是不知道这是否可能.任何帮助,将不胜感激.谢谢.

c++

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

C++ - 在类方法中创建的变量的范围

我正在尝试学习C++,根据我的理解,如果变量超出范围,那么它就会被销毁并重新分配其内存.如果我有一个类并且它的方法创建了一个变量,那么在方法调用之后不应该销毁该变量吗?例如:

class TestClass {
public:
struct Pair{
    std::string name;
    int value;
};
void addPair() {
    //should be deleted after push_back is called?
    Pair x = Pair{ std::string{ "Test Object " }, counter++ };
    pairs.push_back(x);
}
void printPairs() {
    for (int i = 0; i < pairs.size(); i++) {
        std::cout << "pair { " << pairs[i].name << " : " << pairs[i].value << " } " << std::endl;
    }
}
void removePair() {
    pairs.pop_back();
}
private:
    int counter;
    std::vector<Pair> pairs;
}; …
Run Code Online (Sandbox Code Playgroud)

c++ variables methods scope class

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

指向char的指针vs指向数组的指针

在我决定回顾一些所谓的微不足道的例子之前,我以为我对指针有了不错的认识.

我知道的一件事是,在声明一个数组时说:

int arr[2] {3, 5};
Run Code Online (Sandbox Code Playgroud)

arr将保存数组中第一个元素的值,因此尝试打印that(cout << arr)显然给出了地址arr[0].即使我认为我的程序使用指针它仍然相似.

我的问题是为什么我可以打印hbonjour输出,但我不能这样做p

当我h++再次增加并打印它时,我也会看到它onjour.指针有何不同char

#include <iostream>
#include <string>

int main()
{
    char* h = "bonjour";
    int k[4]{3, 4, 5, 6};
    int * p = k;

    std::cout << "Hello, "<< h << "!\n";
}
Run Code Online (Sandbox Code Playgroud)

c++ pointers char

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

我无法在链表的节点中存储字符串

我正在做关于机场模拟的课程,我在尝试将信息存储在角色阵列部分时遇到了一些麻烦.

我应该输入一个字符串,它将存储在planeName节点的一部分,但它似乎无法工作.我int main()现在几乎是空的,因为我不想继续使用不正确的函数进行编码.

以下是我的代码:

struct node {
    char planeName[5];
    int planeNumber;
    struct node* next;
}; 

struct node* front = NULL;
struct node* rear = NULL;

void Enqueue(char name[5], int x);

int main() {

}

void Enqueue(char name[5], int x){

    struct node* temp = (struct node*)malloc(sizeof(struct node));

    temp -> planeName = name; 
    temp -> planeNumber = x;
    temp -> next = NULL;

    if (front == NULL && rear == NULL)
        front = rear = temp;
    rear -> …
Run Code Online (Sandbox Code Playgroud)

c linked-list

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

数组上的指针算术

当我运行下面的代码时,我的输出不是我所期望的.

我理解它的方式是ptr指向Str数组的第一个元素的地址.我认为ptr + 5应该导致+第五元素f.所以输出应该只显示f而不是两者fg.

它为什么显示fg?它与如何cout显示数组有关吗?

#include <iostream>
using namespace std;

int main()
{
    char *ptr;
    char Str[] = "abcdefg";

    ptr = Str;
    ptr += 5;

    cout << ptr;

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

预期产量: f

实际产量: fg

c++ arrays pointers

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

为什么绘制这个方程不会生成正确的曲线?

目的是绘制以下等式:P*sin(x)/ x + cos(x),对于P = 1.6和x在[0,5]中,忽略绿色填充区域,应该看起来像:

在此输入图像描述

但是,从以下代码:

x = 0 : 0.01 : 5;     % ka/pi, where k-wavevector, a-lattice spacing.

P = 1.6;              % 2*m*U_0 / hbar^2.
rhs =  P * sinc(x*pi) + cos(x*pi);
rhs2 = P * ( sin(x*pi) / x*pi) + cos(x*pi);

plot(x, rhs, '--b', x, rhs2, 'b', x, -1*ones(size(x)), 'r', x, 1*ones(size(x)), 'r')
axis([0 5 -3 3])
xlabel('ka/pi')
legend('P*sinc(x) + cos(x)', '(2mU_0b)/(hbar^2) * sin(ka)/ka + cos(ka)', 'y = -1', 'y = 1')
Run Code Online (Sandbox Code Playgroud)

我目前得到的是:

在此输入图像描述

我在这做错了什么?


我在Windows 10,Octave-4.2.1上

matlab trigonometry octave

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