将变量声明为"volatile"意味着直接从内存位置读取/写入,而不是从寄存器变量读取/写入.我对'序列点'有所了解.但我不明白标题中提到的陈述.
有人可以解释一下,并给出一些代码片段吗?
此问题适用于任何类型的静态数据.我只是int用来保持示例简单.
我正在读取一个包含整数的大型XML数据文件,并将它们存储在一个vector<int>.对于我正在使用的特定数据,相同的值连续重复多次是很常见的.
<Node value="4" count="4000">
Run Code Online (Sandbox Code Playgroud)
该count属性表示该值重复x次:
for(int i = 0; i < 4000; i++)
vec.push_back(4);
Run Code Online (Sandbox Code Playgroud)
当我已经知道它将连续出现4000次时,重复存储相同值似乎是浪费内存.但是,我需要能够在任何时候索引到向量.
对于较大的数据对象,我知道我只能存储一个指针,但仍然需要在上面的例子中存储4000个相同的指针.
是否有任何类型的策略来处理这样的问题?
我想定义一个'node'类/结构,然后在代码中声明这些节点的树,这样代码的格式反映了树的结构,并且没有"太多"的样板.
请注意,这不是关于数据结构的问题,而是关于我可以使用C++的哪些功能来获得与下面示例类似的声明性代码样式.
可能使用C++ 0X,这将更容易,因为它在构建对象和集合方面具有更多功能,但我使用的是Visual Studio 2008.
示例树节点类型:
struct node
{
string name;
node* children;
node(const char* name, node* children);
node(const char* name);
};
Run Code Online (Sandbox Code Playgroud)
我想做的事:
声明一棵树,使其结构反映在源代码中
node root =
node("foo",
[
node("child1"),
node("child2",
[
node("grand_child1"),
node("grand_child2"),
node("grand_child3"
]),
node("child3")
]);
Run Code Online (Sandbox Code Playgroud)
NB:我不想做的事情:
声明一大堆临时对象/ colls并构造树'向后'
node grandkids[] = node[3]
{
node("grand_child1"),
node("grand_child2"),
node("grand_child3"
};
node kids[] = node[3]
{
node("child1"),
node("child2", grandkids)
node("child3")
};
node root = node("foo", kids);
Run Code Online (Sandbox Code Playgroud) 如果foo == 13为false,此代码是否具有明确定义的行为?
if (foo == 13 && ++bar > 42)
{
...
}
Run Code Online (Sandbox Code Playgroud) 我试图窥探应用程序正在写入的日志文件.
我已成功将createfile与来自MSR的detours库挂钩,但似乎永远不会使用我感兴趣的文件调用createfile.我也试过用相同的结果挂钩openfile.
我不是一个经验丰富的windows/c ++程序员(甚至是一个经验丰富的程序员),所以我最初的两个想法是应用程序在挂钩api之前调用createfile,或者是否有其他api用于创建文件/获取它们的句柄.
编辑:感谢您的两个好评.我会upwote编码thewheel的回复,因为它是提供信息,但我没有足够的代表:(
我在采访中得到了这个问题,但仍然不知道如何解决这个问题:
假设我们有一个C++代码:
int main(int argc, char* argv[])
{
L<A>* pA = 0;
L<B>* pB = 0;
pA = pB;
}
Run Code Online (Sandbox Code Playgroud)
我们应该添加什么以便实际编译?
换句话说,我们应该如何界定L,A以及B类?请不要使用预处理程序的指令.
我只知道如何解决它:
template<class T> struct L {};
struct A {};
typedef A B;
Run Code Online (Sandbox Code Playgroud)
甚至更简单的前向声明:
struct A;
typedef A B;
template<class> struct L;
Run Code Online (Sandbox Code Playgroud)
还有其他想法吗?
我遇到了用C++编写的代码:
#include<iostream>
using namespace std;
class Base {
public:
virtual int fun(int i) { cout << "Base::fun(int i) called"; }
};
class Derived: public Base {
private:
int fun(int x) { cout << "Derived::fun(int x) called"; }
};
int main()
{
Base *ptr = new Derived;
ptr->fun(10);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
Derived::fun(int x) called
Run Code Online (Sandbox Code Playgroud)
在以下情况中:
#include<iostream>
using namespace std;
class Base {
public:
virtual int fun(int i) { }
};
class Derived: public Base {
private:
int fun(int x) { …Run Code Online (Sandbox Code Playgroud) 以下2个功能基本上是相同的功能吗?
即,是一个int*完全相同的int[]?
int myFunction(int* xVals, int* yVals, int nVertices);
int myFunction(int xVals[], int yVals[], int nVertices);
Run Code Online (Sandbox Code Playgroud)
我该如何使用第一个功能?即,我如何在参数中传递数组?以下是否有效/正确?
int xVals[5], yVals[5], zVals[5];
myFunction(xVals, yVals, zVals, 5);
// or should it be..
myFunction(&xVals[0], &yVals[0], &zVals[0], 5);
Run Code Online (Sandbox Code Playgroud) 我试图了解在哪里使用template,typename但遇到了一个我无法解决的问题。我有一个模板函数f<T>,它使用传递给它的类型(这将是一个类)来调用模板成员函数.f<T>。我认为我typename在函数体中的使用是正确的,但是,我不断收到以下错误:
source.cpp:在函数中
'void f()':
source.cpp:11:19: error: non-template'f'used as template
source.cpp:11:19: 注意:用于'typename T::C::template f'表示它是模板
struct A {
struct C {
template <typename T> void f() {}
};
};
template <typename T> void f() {
typename T::C::f<int>();
}
int main() {
f<A>();
}
Run Code Online (Sandbox Code Playgroud)
请注意它建议使用的最后一个错误'typename T::C::template f'。所以我做了以下改动:
// ...
typename T::C::template f<int>();
// ...
Run Code Online (Sandbox Code Playgroud)
我按照它说的做了,但后来我收到了下一行错误:
错误:没有名为类模板
'f'中'struct A::C'
我相信,这个错误是不正确的,有是在事实上称为公共模板函数f中struct …
我想生成2^300到2 ^ 10范围内的随机数.我听说这个rand()函数不适合这么多的数字.有没有其他方法可以用几乎相等的分布生成它?