我在为我的问题 (Q) 找到答案时遇到了麻烦,所以我在这里注册以询问你们它是如何真正起作用的(或不起作用);)
我在 Visual Studio 2012 中用 c++ 编写,但仍然不知道头文件中的#includes、命名空间等如何。我什至需要使用它们吗?
(Q1):假设我有一个 .cpp 文件和几个 .h 文件,它们正在使用例如:向量、来自 <algorithm>、<ctime> 和其他一些库的东西,但我不写 #include <something > 在头文件中,仅在 .cpp 中。这是对的吗?或者我应该在每个标题中包含我使用的所有内容?
通常一切都对我有用,我什至可以说它总是“有效”,因为我还没有太多经验,而且我通常将所有内容包含在一个 .cpp 和 1 或 2 个带有一些 void 函数的标题中。但是不知道它是否有效,因为它应该,或者因为例如 mu 编译器允许这样做,并且在某些问题中它可能会导致错误。
(Q2):现在关于使用命名空间std的事情;在某些情况下,.h 文件中的函数可以在没有它的情况下工作,但有时不能。例如,正在工作的空位(只是合并排序的简单空位):
#ifndef LISTA_1_H
#define LISTA_1_H
#include "Lista_0_Zadanie_1.h"
void MERGE(vector<double> &A, int p, int q, int r)
{
int i = p;
int j = q+1;
int lenght = r - p + 1;
int k=0;
vector<double> merged;
merged.assign (lenght,0);
while((i<=q)&&(j<=r))
{
if(A[i] <= A[j])
{
merged[k]=A[i];
++i;
}
else
{
merged[k]=A[j];
++j;
}
k++;
}
if(j<=r)
{
while(j<=r)
{
merged[k]=A[j];
++j;
++k;
}
}
if(i<=q)
{
while(i<=q)
{
merged[k]=A[i];
++i;
++k;
}
}
for (i=0;i<lenght;++i)
A[p+i]=merged[i];
}
void MERGESORT(vector<double> &A, int k, int l)
{
if(k<l)
{
int m = (k+l)/2;
//int mp = m+1;
// cout << "koza"<<endl;
MERGESORT(A,k,m);
MERGESORT(A,m+1,l);
MERGE(A,k,m,l);
}
}
void TRIPLE_MERGESORT(vector<double> &A, int k, int l)
{
if(k<l)
{
int one_third = (l-k)/3;
int two_third = 2*(l-k)/3; // k < k+one_third < k+two_third < l
TRIPLE_MERGESORT(A,k,k+one_third);
TRIPLE_MERGESORT(A,k+one_third+1,k+two_third);
TRIPLE_MERGESORT(A,k+two_third+1,l);
MERGE(A,k,k+one_third,k+two_third);
MERGE(A,k,k+two_third,l);
}
}
void INSERT_MERGESORT (vector<double> &A, int k, int l)
{
if(l<19) // l=n-1, więc n<20 <=> l < 19
{
double y;
int i,j;
for(i=0; i<l+1; ++i)
{
y = A[i];
j = i-1;
while((j>=0) && (A[j]>y) )
{
A[j+1] = A[j];
--j;
}
A[j+1]=y;
}
}
else
MERGESORT(A,k,l);
}
#endif
...并且在某些情况下,如果我不写“使用命名空间 std;”,它就不起作用 或在正确的位置添加“ std:: ”(在向量之前),它不起作用:
#ifndef SCHEMAT_HORNERA_H
#define SCHEMAT_HORNERA_H
//using namespace std;
void HORNER( int n, double z0, double p_z0, vector<double> a, vector<double> &B)
{
B[n] = a[n];
for(int k = n-1; k>=0; --k)
{
B[k] = a[k] + z0*B[k+1];
}
}
#endif
所以这是我的问题:我应该总是使用“std::”还是“using namespace std”?如果是,为什么我的文件直到现在“工作”?因为在某些情况下 VS 允许这样做,虽然它不正确并且某些编译器不允许这样做?