我为一些数据结构编写了一个解析器,经过几个小时的调试后我发现问题是Visual Studio没有像我说的那样解释结构.似乎使用了一些"填充"
struct foo {
unsigned char a; //0x00
unsigned char b; //0x01
unsigned int c; //0x02
unsigned int d; //0x06
unsigned int e; //0x0A
unsigned int f; //0x0E
//0x12
};
Run Code Online (Sandbox Code Playgroud)
我期望"sizeof(foo)= 4*4 + 2 = 18",但我得到"sizeof(foo)= 20".是否有可能为这个特殊结构转换填充?我试过了
__declspec(align(1)) struct foo { ...
Run Code Online (Sandbox Code Playgroud)
但它不起作用.谢谢您的帮助.
在一个应用程序中,我详尽地生成了许多子问题,并使用"std :: set"操作解决它们.为此,我需要" 插入 "和" 查找 "元素,并在排序列表上" 迭代 ".
问题是,对于数百万个子问题中的每一个,"std :: set"实现每次在集合中插入元素时都会分配新内存,这会使整个应用程序变得非常慢:
{ // allocate a non-value node
_Nodeptr _Pnode = this->_Getal().allocate(1); // <- bottleneck of the program
Run Code Online (Sandbox Code Playgroud)
是否有一些stl-structure允许我在"O(log(n))"中执行上述操作而不重新分配任何内存?
我不希望逆向工程师在我的应用程序中读取硬编码字符串的纯文本.对此的简单解决方案是使用简单的XOR加密.问题是我需要一个转换器,在我的应用程序中它将如下所示:
//Before (unsecure)
char * cString = "Helllo Stackoverflow!";
//After (secure)
char * cString = XStr( 0x06, 0x15, 0x9D, 0xD5FBF3CC, 0xCDCD83F7, 0xD1C7C4C3, 0xC6DCCEDE, 0xCBC2C0C7, 0x90000000 ).c();
Run Code Online (Sandbox Code Playgroud)
是否有可能通过使用某些结构来维护干净的代码
//Before (unsecure)
char * cString = "Helllo Stackoverflow!";
//After (secure)
char * cString = CRYPT("Helllo Stackoverflow!");
Run Code Online (Sandbox Code Playgroud)
它也适用于很长的字符串(1000个字符?:-)).先感谢您
我正在尝试为树木编写一个分而治之的算法.对于除法步骤,我需要一种算法,通过移除节点将给定的无向图G =(V,E)与n个节点和m个边分割成子树.所有子图应具有不包含超过n/2个节点的属性(树应尽可能分割).首先,我尝试以递归方式从树中删除所有叶子以找到最后剩余的节点,然后我尝试在G中找到最长的路径并删除它的中间节点.下面给出的图表显示两种方法都不起作用:

是否有一些工作算法可以满足我的需要(在上述情况下返回节点H).
请考虑以下代码段:
#include <iostream>
#include <ctime>
#include <vector>
#include <list>
using namespace std;
#define NUM_ITER 100000
int main() {
clock_t t = clock();
std::list< int > my_list;
std::vector< std::list< int >::iterator > list_ptr;
list_ptr.reserve(NUM_ITER);
for(int i = 0; i < NUM_ITER; ++i) {
my_list.push_back(0);
list_ptr.push_back(--(my_list.end()));
}
while(my_list.size() > 0) {
my_list.erase(list_ptr[list_ptr.size()-1]);
list_ptr.pop_back();
}
cout << "Done in: " << 1000*(clock()-t)/CLOCKS_PER_SEC << " msec!" << endl;
}
Run Code Online (Sandbox Code Playgroud)
当我使用visual studio编译并运行它时,启用了所有优化,我得到输出:
完成:8毫秒!
当我用g ++编译并运行它时,使用标志
g ++ main.cpp -pedantic -O2
我得到了输出
完成:7349毫秒!
这比粗鲁慢1000倍.这是为什么?根据"cppreference"调用列表上的擦除应该只用掉恒定时间.
代码在同一台机器上编译和执行.
我不得不承认我的C++有点生疏.在一个项目中,我尝试创建一个类向量并使用它们.有一个问题,因为我想识别向量的每个条目,并带有一个唯一的指针,以便快速访问,但它不起作用.这是我的问题的最小例子:
#include <iostream>
#include <vector>
class Foo{
public:
Foo() { ptr = this; }
~Foo() {}
Foo * ptr;
};
int main()
{
std::vector<Foo> vec;
for(unsigned int i = 0; i < 2; ++i)
vec.push_back(Foo());
for(unsigned int i = 0; i < vec.size(); ++i)
std::cout << "Object Self-Pointer: " << std::hex << reinterpret_cast<unsigned int>(vec[i].ptr) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
实际产量:
Object Self-Pointer: bfbebc18
Object Self-Pointer: bfbebc18
Run Code Online (Sandbox Code Playgroud)
预期产量:
Object Self-Pointer: bfbebc18
Object Self-Pointer: bfbebc1c
Run Code Online (Sandbox Code Playgroud)
(一些指向实际对象的指针).
我希望你能帮我解决这个问题,提前谢谢你.
c++ ×5
stl ×3
algorithm ×1
c++11 ×1
encryption ×1
g++ ×1
graph-theory ×1
macros ×1
optimization ×1
set ×1
vector ×1