我理解使用未命名的命名空间来使函数和变量具有内部链接.头文件中不使用未命名的命名空间; 只有源文件.源文件中声明的类型不能在外部使用.那么在未命名的命名空间中放置类型有什么用呢?
请参阅这些链接,其中提到的类型可以放在未命名的命名空间中:
考虑以下C++类:
struct Point
{
int x;
int y;
explicit Point() =default; // 1
explicit Point(int x_, int y_): x(x_), y(y_) { } // 2
};
Run Code Online (Sandbox Code Playgroud)
第二个构造函数用于创建Point具有特定值x和y值的构造函数.第一个存在,以便我可以默认构造一个Point.然而,为了提高效率,这是defaultED和不设置x和y为零.如果我确实想将所有成员设置为零,我可以有另一个构造函数:
explicit Point(int val) : x(val), y(val) { } // 3
Run Code Online (Sandbox Code Playgroud)
这样,我可以选择默认初始化Point,或者将所有成员设置为零来初始化它:
Point p1; // Don't initialize members.
Point p2(0); // Initialize all members to zero.
Run Code Online (Sandbox Code Playgroud)
第三个构造函数的问题是我可以传递任何值,而不仅仅是零.例如:
Point p(1); // Both x and y set to 1! Is this …Run Code Online (Sandbox Code Playgroud) 我需要对一大堆大型物体进行排序,这让我想到:有没有办法减少掉期数量?
所以我使用quicksort(但任何其他快速排序也应该在这里工作)来将索引排序到数组中的元素; 指数交易便宜.然后我使用这些索引将实际对象交换到它们的位置.不幸的是,这使用O(n)额外空间来存储索引.下面的代码说明了算法(我称之为IndexSort),在我的测试中,对于大型对象的数组,它似乎比plain quicksort快.
template <class Itr>
void IndexSort(Itr begin, Itr end)
{
const size_t count = end - begin;
// Create indices
vector<size_t> ind(count);
iota(ind.begin(), ind.end(), 0);
// Sort indices
sort(ind.begin(), ind.end(), [&begin] (const size_t i, const size_t j)
{
return begin[i] < begin[j];
});
// Create indices to indices. This provides
// constant time search in the next step.
vector<size_t> ind2(count);
for(size_t i = 0; i < count; ++i)
ind2[ind[i]] = i;
// …Run Code Online (Sandbox Code Playgroud)