我正在使用我自己的命名空间 alg
实现快速排序。
namespace alg
{
static unsigned int comparisons(0);
void quickSort (std::vector<int>& a);
int partition (std::vector<int>& b, int leftIndex);
}
我需要计算数组中元素的比较,因此我使用静态变量 comparisons
,GETS 在函数中递增,但在 main.cpp
中它仍然保持为 0 .
怎么了?为什么在 main.cpp 中,我猜每个 .cpp
文件都有一个 serapate 静态变量 comparisons
,但我不确定。无论如何,我该如何解决这个问题?我真的需要编写一个可以保留静态变量的类吗?或者这仍然无济于事?
请建议我在哪里可以找到有关静态变量和命名空间的详细信息?
QuickSort.cpp
void alg::quickSort(std::vector<int>& a)
{
....
comparisons+=1;
}
int alg::partition(std::vector<int>& a, int leftIndex)
{
comparisons+=a.size()-1;
....
}
main.cpp
alg::quickSort(myvec);
...
std::cout << alg::comparisons << std::endl;
最佳答案
声明为 static
的 namespace 范围变量具有内部链接,这意味着每个翻译单元(=.cpp
文件)都有自己的拷贝。 那么在您的情况下可能发生的情况是实现 quicksort
和 partition
的文件中的拷贝增加了,但是 main()
中的拷贝增加了> 不是。
您需要做的是用 extern
关键字替换 static
关键字(使该行只是一个声明),然后在一个 .cpp
文件(可能是实现quicksort
和partition
的文件):
namespace alg
{
unsigned int comparisons = 0;
}
关于这方面的更多信息可以引用自己喜欢的good C++ book .
关于c++ - 来自命名空间的静态变量不会递增,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20911134/