这是一个基于问题答案的问题:
const char myVar*与const char myVar []
const char* x = "Hello World!";
const char x[] = "Hello World!";
Run Code Online (Sandbox Code Playgroud)
我现在了解不同之处,但我的新问题是:
(1)如果我重新分配x,第一行中的"Hello World"字符串会发生什么?在那一点上什么都没有指向它 - 当范围结束时它会被摧毁吗?
(2)除了常量之外,编译器中两个示例中的值如何以不同方式存储在内存中?
我对STL以及如何使用它非常熟悉.我的问题是......
如果我要实现自己的STL容器类型,内部迭代器是如何定义的?STL类倾向于具有顺序或随机访问迭代器,这些迭代器的const_版本以及流迭代器.
这些迭代器是否都在每个STL类中完全定义,或者是否存在某种基类来获取大部分迭代器功能?有谁知道如何实现支持这些不同类型的迭代器的类的良好参考?
我一直在审查练习算法,我现在正在研究一种我非常喜欢的置换算法:
void permute(char* set, int begin, int end) {
int range = end - begin;
if (range == 1)
cout << set << endl;
else {
for(int i = 0; i < range; ++i) {
swap(&set[begin], &set[begin+i]);
permute(set, begin+1, end);
swap(&set[begin], &set[begin+i]);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我实际上想将此应用于会有许多重复字符的情况,所以我需要能够修改它以防止打印重复的排列.
我如何检测我是否生成了重复内容?我知道我可以将它存储在散列或类似的东西中,但这不是最佳解决方案 - 我更喜欢不需要额外存储的解决方案.有人可以给我一个建议吗?
PS:我不想使用STL置换机制,我不想在某处引用另一个"唯一置换算法".我想了解用于防止重复的机制,以便在可能的情况下将其构建到学习中.
以下是代码外观的粗略示例,问题是如何让DerivedOne和DerivedTwo具有重载的<<运算符,但将这些对象存储在Base*的向量中.
至于我想要达到的目标; 我希望能够遍历对象向量并输出我在DerivedOne和DerivedTwo中告诉它的信息.
vector<Base*> objects;
class Base
{
private:
object Data
public:
object getData() { return Data; }
};
class DerivedOne : public Base
{
}
class DerivedTwo : public Base
{
}
Run Code Online (Sandbox Code Playgroud)
现在我知道有这个,但它不适用于我的目的.
friend ostream &operator<<(ostream &stream, Object object)
{
return stream << "Test" << endl;
}
Run Code Online (Sandbox Code Playgroud) 我遇到了许多需要迭代器的问题.通常,它们是简单的事情,您已经拥有了可以遵循的基础数据结构.其他时候,它变得更加复杂.
一个例子是使用有序遍历在没有父链接的情况下迭代BST.这要求您执行以下操作:
您可以完成工作以在hasNext()或next()中找到下一个节点.您还可以在构造函数中或第一次调用hasNext()时找到第一个节点.
我的问题
在迭代器实现中,有哪些标准或最佳实践可用于执行大部分工作?一种方式比另一种"更清洁"吗?
可能重复:
atexit功能的目的是什么?
至少在UNIX中:我知道C/C++可以在main - exit处理程序的出口处注册一些要调用的函数.可以使用以下相反的顺序注册要调用的函数:
int atexit(void (*func) (void));
Run Code Online (Sandbox Code Playgroud)
我无法确定这将如何有用.函数是void/void和global,因此它们不太可能访问程序周围的许多变量,除非变量也是全局变量.有人能让我知道你会对退出处理程序做些什么吗?
另外,退出处理程序在非UNIX平台上的工作方式是否相同,因为它们是ANSI C规范的一部分?
我正在阅读一本C++书籍,我正在讨论减少模板生成的目标代码(Effective C++ III作者:Scott Meyers).其中一个例子是:
template <typename T, std::size_t n>
class SquareMatrix: private SquareMatrixBase<T> {
public:
SquareMatrix()
: SquareMatrixBase<T>(n, 0),
pData(new T[n*n])
{ this->setDataPtr(pData.get()); }
... functions ...
private:
boost::scoped_array<T> pData;
};
Run Code Online (Sandbox Code Playgroud)
基类,SquareMatrixBase有一个函数调用:
void invert(std::size_t matrixSize);
Run Code Online (Sandbox Code Playgroud)
"本书继续说"无论数据存储在何处,从膨胀的观点来看,关键结果是现在很多 - 也许全部 - SquareMatrix的成员函数可以是对非内联基类的简单内联调用与拥有相同类型数据的所有其他矩阵共享的版本,无论其大小如何."
"内联调用非内联基类版本......"是什么意思?如果它是内联调用我会认为它会将任何函数的整个基类版本放到使用内联的地方,但这会导致我想到的相同代码膨胀.它说这就像它对代码膨胀的好处.
如果您需要更多背景信息让我知道,章节很长,我努力提供背景信息,但我可能错过了一些东西.
在这段经文中使用方矩阵和方矩阵的目的是:
SquareMatrix最初是一个独立模板(未派生).它包含一系列基于模板参数n值进行操作的函数.因此,对于每个使用的n值(或者对于每对n,使用的T),每个函数基本上都有一个副本作为新模板,并为每个参数对实例化这些函数.创建SquareMatrixBase是为了将依赖于size参数的函数移动到基类.由于基类仅使用类型参数(而不是大小)进行实例化,因此可以通过传入派生类传递给基类构造函数的size值来调用基类中的函数.这意味着,传入SquareMatrix模板的每个类型名称T只有一个版本的函数,无论传入的是std :: size_t n(而不是{T,n}的每个组合的每个函数的一个版本.
当您使用PThreads取消时,我对清理订单有点困惑.通常,如果您的线程已分离,它会在终止时自动清除.如果它没有分离,则需要加入它以回收系统资源.
我正在阅读的教科书中陈述以下内容,奇怪的是,加入对于取消而言是可选的:
"如果你需要知道线程何时实际终止,你必须在取消后调用pthread_join加入它."
那么,我是否需要加入已取消的线程来释放其资源 - 如果没有,那么为什么呢?
我曾经(并且已经很长时间)认为你必须完全定义.h文件中的所有模板函数,以避免因模板编译过程而发生的多个定义错误(非C++ 11).
我正在阅读一个同事的代码,他有一个非模板类,其中有一个模板函数,并且他将函数声明与函数定义分开(在H中声明,在CPP中定义).它汇编并且工作正常,令我惊讶.
非模板类中的模板函数如何编译,以及如何编译模板类中的函数之间是否存在差异?有人可以解释这种差异是什么,或者我可能会感到困惑的地方?
我正在审查我最近加入的项目的一些代码,并在.NET 3.5的C#Win Forms Application中找到了这个:
public void foo()
{
//Normal code for function foo.
//This is at the end and it is left-indented just as I put it here.
EndPoint:
{
}
}
Run Code Online (Sandbox Code Playgroud)
当我单击" EndPoint/Go To Definition"时,它显示"无法导航到端点",但整个项目非常小并且编译/运行没有错误,所以它不是缺少引用或任何东西.
什么是EndPoint,这个语法的名称是什么:{}?