nam*_*man 1 c++ arrays swap pointers stl
我们如何以恒定复杂度或 O(1) 交换 2 个数组?有没有办法做到这一点?我试过使用指针,但它给出了错误
加上这无济于事,因为它只是交换指针而不是数组
#include <algorithm>
int AA[100], *A=AA, BB[100], *B=BB;
swap(A, B);
Run Code Online (Sandbox Code Playgroud)
我也尝试过使用向量赋值运算符,但它们具有线性复杂性,即 O(N) 不是常数,所以有什么方法可以在 O(1) 中交换两个数组?(通过使用指针或其他东西)
我尝试在网上搜索找到了 codeforces 的链接(http://codeforces.com/blog/entry/11971),但这没有帮助。
std::swap对向量 ( std::vector)使用(使用成员函数交换)具有 O(1) 的复杂度。
来自 C++ 标准
无效交换(向量和x);
10 效果:将 *this 的内容和容量()与 x 的内容和容量()交换。
11 复杂性:恒定时间。
如果使用运算符 new 动态分配数组,则可以使用恒定时间“交换数组”。在这种情况下,您确实只能交换指向数组第一个元素的指针。
例如
#include <iostream>
#include <algorithm>
int main()
{
int **a = new int *[2];
a[0] = new int[5] { 0, 1, 2, 3, 4 };
a[1] = new int[5] { 5, 6, 7, 8, 9 };
for ( size_t i = 0; i < 2; i++ )
{
for ( size_t j = 0; j < 5; j++ ) std::cout << a[i][j] << ' ';
std::cout << std::endl;
}
std::cout << std::endl;
std::swap( a[0], a[1] );
for ( size_t i = 0; i < 2; i++ )
{
for ( size_t j = 0; j < 5; j++ ) std::cout << a[i][j] << ' ';
std::cout << std::endl;
}
std::cout << std::endl;
delete [] a[0];
delete [] a[1];
delete [] a;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是
0 1 2 3 4
5 6 7 8 9
5 6 7 8 9
0 1 2 3 4
Run Code Online (Sandbox Code Playgroud)
事实上,同样的操作在 std::vector 中完成。
| 归档时间: |
|
| 查看次数: |
3429 次 |
| 最近记录: |