我已经为我的堆栈对象类开发了一个名为"rotate"的方法.我所做的是,如果堆栈包含元素:{0,2,3,4,5,6,7}我需要向前和向后旋转元素.
如果我需要向前旋转2个元素,那么我们将在数组中有{3,4,5,6,7,0,2}.如果我需要向后旋转,或者-3个元素,那么,查看原始数组,{5,6,7,0,2,3,4}
所以我开发的方法运行正常.它只是非常无效的IMO.我想知道我是否可以使用mod运算符包围数组?或者,如果它们是无用的代码,我还没有意识到,等等.
我想我的问题是,我该如何简化这种方法?例如使用较少的代码.:-)
void stack::rotate(int r)
{
int i = 0;
while ( r > 0 ) // rotate postively.
{
front.n = items[top+1].n;
for ( int j = 0; j < bottom; j++ )
{
items[j] = items[j+1];
}
items[count-1].n = front.n;
r--;
}
while ( r < 0 ) // rotate negatively.
{
if ( i == top+1 )
{
front.n = items[top+1].n;
items[top+1].n = items[count-1].n; // switch last with first
}
back.n = items[++i].n; // second …Run Code Online (Sandbox Code Playgroud) 我有一个矢量映射对的映射,如下所示:
std::map<std::pair<uint16, uint16>, std::vector<std::vector<uint32> > >
Run Code Online (Sandbox Code Playgroud)
地图填充在类的构造函数中.这个类提供了一个返回指向std::vector<std::vector<uint32> >(映射值部分)的指针的公共方法,如下所示:
typedef std::pair<uint16, uint16> key;
typedef std::vector<std::vector<uint32> > value;
value* FindValues(key someKey) {
std::map<key, value>::const_iterator it;
it = someStore.find(someKey);
if (it != someStore.end())
return &(value)it->second;
return NULL;
}
Run Code Online (Sandbox Code Playgroud)
这是奇怪的时候.迭代FindValues返回的向量时,所有子向量都有一个大的负数(例如-1818161232)作为它们的第一个值.但是,如果我使用如下函数:
value FindValues(key someKey) {
std::map<key, value>::const_iterator it;
return someStore.find(someKey)->second;
}
Run Code Online (Sandbox Code Playgroud)
......那么价值是正常的.这仅发生在所有子向量的索引0处的值.但是,使用第二种方法,如果找不到密钥,我的应用程序会出现段错误(原因很明显).我究竟做错了什么?
我试图初始化整个int数组,在搜索 Stackoverflow 后,我发现最好的方法是使用std::fill_nfrom<algorithm>或<vector>header,但包含两者会给出错误。我认为这些方法只能在 C++ 中使用,还是我做错了什么?
如何使用 C 中的值初始化整个数组而不使用任何循环,即在单个语句中?
我正在 Fedora 14 终端上工作并使用 gcc 编译它。
我最近研究了一个用GCC 8编译的软件中的segfault。代码如下(这只是一个草图)
struct Point
{
int64_t x, y;
};
struct Edge
{
// some other fields
// ...
Point p; // <- at offset `0xC0`
Edge(const Point &p) p(p) {}
};
Edge *create_edge(const Point &p)
{
void *raw_memory = my_custom_allocator(sizeof(Edge));
return new (raw_memory) Edge(p);
}
Run Code Online (Sandbox Code Playgroud)
这里的关键点是my_custom_allocator()返回指向未对齐内存的指针。代码崩溃是因为为了将原始点复制p到Edge::p新对象的字段中,编译器在 [内联] 构造函数代码中使用了movdqu/movaps对
movdqu 0x0(%rbp), %xmm1 ; read the original object at `rbp`
...
movaps %xmm1, 0xc0(%rbx) ; store it into the new `Edge` object …Run Code Online (Sandbox Code Playgroud) 所以我的朋友给了我一些源代码,所以我可以回顾和理解它,我有一个问题,但由于他不在线,我想我会在这里尝试,主要是我不太明白这一行.
num += i;
Run Code Online (Sandbox Code Playgroud)
基本上,这是相同的
num = num + i
Run Code Online (Sandbox Code Playgroud)
对?
如果您需要更多细节请告诉我!我期待很快听到您的回复.
首先,关于我的设置.
我有一个包含三个表的原始数据库:
A.列出各种位置的表:[location_code],[location_name]
B.描述项目的表:[item_code],[item_name],[item_price]
最后是一个将roo ^ H ^ H ^ H整个数据库连接在一起的表
C.表说明每个位置存储的项目和数量:[location_code],[item_code],[item_quantity].该表可以具有多个具有相同[location_code]的条目,因为不同的项可以存储在同一位置.基本上,这是一个从位置到项目的一对多关系的教科书实现,每个位置 - 项目链接附加一个额外的属性(数量).
现在,我需要做的就是创建一个表单,列出存储在特定位置的所有项目.这是Access中"子窗体"功能的基本用例.主窗体只是导航到不同的位置,而子窗体列出项目.
我用
SELECT C.location_code, B.item_name, B.item_code, B.item_price, C.item_quantity
FROM B INNER JOIN C ON B.item_code=C.item_code
Run Code Online (Sandbox Code Playgroud)
作为子表单的记录源.主窗体通过[location_code]链接到子窗体.子表单设置有列表布局(不是表格布局),即每个数据库字段都有自己的控制元素.
到目前为止一切都很完美.我在主窗体中选择了位置,子窗体为我提供了当前位置的可编辑[item_name] - [item_price] - [item_quantity]三元组列表.
下一步,我想为每个上述三元组添加一个计算控件.我想知道每种商品的总价格(即[item_price] * [item_quantity]每行的价格).很简单,我将计算的控件添加到子窗体的"可重复"区域并指定
= [item_price] * [item_quantity]
Run Code Online (Sandbox Code Playgroud)
作为价值的公式.再一次,一切都很完美.现在我的列表不是上面的三元组,而是每行有四个条目:[item_name] - [item_price] - [item_quantity] - [total_item_price].而且,重要的是,当我编辑[item_price]或[item_quantity]时,[total_item_price]会在我完成编辑后自动重新评估.
而作为最后一步,我想补充另一个计算控制,将显示存储在当前位置的所有项目的总价格(姑且称之为"总计").A也控制子表单(这次进入"脚注"区域)并指定以下公式作为其值
= SUM([item_price] * [item_quantity])
Run Code Online (Sandbox Code Playgroud)
现在,这有效.每次更改主窗体中的位置时,都会正确计算总值.此外,当我更改当前位置的任何项目的[item_price]时,总计也会自动更新.但是,当我更改[item_quantity]时,总计不会更新(???).点击F9将使其更新.来回更改当前位置将更新它.但是,不幸的是,仅仅更改[item_quantity]不会触发自动更新.
有谁知道,这里可能有什么问题?为什么[item_price]中的更改会触发总计的自动更新,而[item_quantity]中的更改则不会?直觉上,这些字段似乎具有相同的状态(除了前者来自表B,而后者来自表C).为什么行为不同?如何让它自动更新?
我一直试图理解我用以下代码得到的错误
bytes2bits(p,q,pixels)
u_char *p, *q;
register u_int pixels;
{
register u_char *r, a;
register u_long *l;
...
switch (*l++) {
case 0x00000000: a = 0x00; break;
case 0x00000001: a = 0x10; break;
case 0x00000100: a = 0x20; break;
case 0x00000101: a = 0x30; break;
case 0x00010000: a = 0x40; break;
case 0x00010001: a = 0x50; break;
case 0x00010100: a = 0x60; break;
case 0x00010101: a = 0x70; break;
case 0x01000000: a = 0x80; break;
case 0x01000001: a = 0x90; break; …Run Code Online (Sandbox Code Playgroud) 如何在C++中将2D数组归零?我需要两个for循环吗?
来自其他更高级的语言,我想知道为什么C++不会将数组初始化为有意义/合理的默认值?我是否总是需要声明一个数组然后将其"归零"?
当我尝试像这样声明一个global二维数组时C++:
int maxX = 10;
int maxZ = 10;
SDL_Rect mapX[maxX][maxZ];
Run Code Online (Sandbox Code Playgroud)
我得到一个错误说 error: variable-size type declared outside of any function
为什么这段代码不会导致y == 0x100?
uint8_t x = 0xff;
unsigned y = ++((unsigned)x);
Run Code Online (Sandbox Code Playgroud)
请在此处查看:http://codepad.org/dmsmrtsg
假设我在一个类中有3个函数:
class Foo {
inline void FooInline() { /* bla bla */ }
static void fooStatic();
void foo();
};
Run Code Online (Sandbox Code Playgroud)
据我所知,最后两个有外部联系,而第一个有内部.
我想知道哪个函数最快可以调用,以及什么是权衡.
谢谢
也许我对遗传和多态性的了解并不是我想象的那样.任何人都能解释一下吗?
设置(问题的平凡化):
class X {
};
class Y {
};
class Base {
public:
void f( X* ) {}
};
class Child: public Base {
public:
void f( Y* ) {}
};
Run Code Online (Sandbox Code Playgroud)
问题:这应该有效,对吧?
int main( void ) {
X* x = new X();
Y* y = new Y();
Child* c = new Child();
c->f( x );
c->f( y );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我得到错误(GCC 4.4):
`no matching function for call to 'Child::f(X*&)'`
`note: candidates are: void Child::f(Y*)`
Run Code Online (Sandbox Code Playgroud)