我发现很遗憾,与未使用的普通函数不同,仍然必须定义未使用的虚函数.我对在创建类对象时创建的隐式vtable和vpointer有所了解- 这有点回答了问题(必须定义函数以便可以定义指向虚函数的指针)但这会进一步推动我的查询仍然.
如果根本不可能调用虚函数,为什么需要为函数创建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条目?或者这对编译器来说是不合理的事情?
如果输入是模式,则模式识别程序必须打印包含模式的所有行.如果输入是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?
我需要集成一个函数(两个变量).我知道我可以通过使用Fubini定理来集成一个变量函数,然后使用数值方法,如Rectangle方法或梯形规则.
但是在C++中有没有预先构建的函数呢?我需要整合单位R2
三角形((0,0), (1,0), (0,1))
.
我是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 A
all 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。
我的问题是:是否可以修改或强制Armadillo像Lapack ++一样做一个不错的技巧?犰狳的用法LAPACK
和BLAS
例程。或者,也许有人可以推荐使用另一个库解决此问题的另一种方法? …
鉴于以下情况:
template <typename T>
class Whatever
{
public:
Whatever(T &&t): _t(std::move(t)) { }
private:
T _t;
};
Run Code Online (Sandbox Code Playgroud)
何时T
是指针类型,我需要检查构造函数的t
arg以查看它是否-1
(不要求),并nullptr
在将其分配给之前将其更改为a _t
.
换句话说,我需要为指针类型重载此构造函数.
有谁知道这是否可行?
注意:即使我在指针类型上部分地专门化类,我希望该类在可能的情况下从上面的类本身继承(因为除了这两个类的行为是相同的),但是不知道这是否可能.任何帮助,将不胜感激.谢谢.
我正在尝试学习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) 在我决定回顾一些所谓的微不足道的例子之前,我以为我对指针有了不错的认识.
我知道的一件事是,在声明一个数组时说:
int arr[2] {3, 5};
Run Code Online (Sandbox Code Playgroud)
arr
将保存数组中第一个元素的值,因此尝试打印that(cout << arr
)显然给出了地址arr[0]
.即使我认为我的程序使用指针它仍然相似.
我的问题是为什么我可以打印h
并bonjour
输出,但我不能这样做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) 我正在做关于机场模拟的课程,我在尝试将信息存储在角色阵列部分时遇到了一些麻烦.
我应该输入一个字符串,它将存储在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) 当我运行下面的代码时,我的输出不是我所期望的.
我理解它的方式是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
目的是绘制以下等式: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上
c++ ×7
c ×2
pointers ×2
armadillo ×1
arrays ×1
char ×1
class ×1
definition ×1
eigenvalue ×1
eigenvector ×1
function ×1
integration ×1
lapack++ ×1
linked-list ×1
matlab ×1
methods ×1
numerical ×1
octave ×1
scope ×1
trigonometry ×1
variables ×1
virtual ×1