【发布时间】:2014-06-12 02:38:41
【问题描述】:
我想知道是否有人可以帮助我。
我寻找支持这四种操作的数据结构(如列表、队列、堆栈、数组、向量、二叉树等):
- isEmpty(真/假)
- 插入单个元素
- pop(即获取&删除)单个元素
- 拆分为两个结构,例如取大约一半(比如说 +/- 20%)的元素并将它们移动到另一个结构中
注意我根本不关心元素的顺序。
插入/弹出示例:
A.insert(1), A.insert(2), A.insert(3), A.insert(4), A.insert(5) // contains 1,2,3,4,5 in any order
A.pop() // 3
A.pop() // 2
A.pop() // 5
A.pop() // 1
A.pop() // 4
以及拆分示例:
A.insert(1), A.insert(2), A.insert(3), A.insert(4), A.insert(5)
A.split(B)
// A = {1,4,3}, B={2,5} in any order
我需要结构尽可能快 - 最好是 O(1) 中的所有四个操作。我怀疑它已经在std中实现了所以我会自己实现它(在C++ 11中,所以可以使用std::move)。
注意 insert、pop 和 isEmpty 的调用频率大约是 split 的十倍.
我用list 和vector 尝试了some coding,但没有成功:
#include <vector>
#include <iostream>
// g++ -Wall -g -std=c++11
/*
output:
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
5 6 7 8 9
*/
int main ()
{
std::vector<int> v1;
for (int i = 0; i < 10; ++i) v1.push_back(i);
for (auto i : v1) std::cout << i << " ";
std::cout << std::endl;
auto halfway = v1.begin() + v1.size() / 2;
auto endItr = v1.end();
std::vector<int> v2;
v2.insert(v2.end(),
std::make_move_iterator(halfway),
std::make_move_iterator(endItr));
// sigsegv
/*
auto halfway2 = v1.begin() + v1.size() / 2;
auto endItr2 = v1.end();
v2.erase(halfway2, endItr2);
*/
for (auto i : v1) std::cout << i << " ";
std::cout << std::endl;
for (auto i : v2) std::cout << i << " ";
std::cout << std::endl;
return 0;
}
任何示例代码、想法、链接或任何有用的东西?谢谢
相关文献:
【问题讨论】:
-
I tried some coding with list and vector but with no success.到目前为止你有什么? -
拆分需要在中间如何?缓存效率有多重要(由
vector等连续容器提供)?拆分时通常存储多少字节? -
如果你可以容忍在中间分割不完全,它可以比O(n)更快,看我的回答。
-
我已经用我刚刚编写的容器编辑了我的答案,以便在 O(log n) 中执行所有操作。