斗胆发一个自己写过的
两周前店面pass
- class BlockList {
- struct Block {
- vector<char> data;
- };
- typedef list<Block>::iterator blockIter;
- typedef vector<int>::iterator dataIter;
- list<Block> blockList;
- int totalSize = 0;
- int blockSize = 0;
- public :
- void insert(char c, int pos){
- totalSize ++;
- blockSize = sqrt(totalSize);
- if (blockList.empty()) {
- auto iter = blockList.insert(blockList.begin(), Block());
- iter->data.emplace_back(c);
- } else {
- auto iter = find(pos);
- if (iter == blockList.end()) {
- blockList.back().data.emplace_back(c);
- } else {
- iter->data.insert(iter->data.begin()+pos, c);
- }
- }
- maintain();
- }
-
- void maintain(){
- // split bigger
- // merge smaller
- for(auto iter = blockList.begin(); iter != blockList.end(); iter ++) {
- if (iter->data.size() > 2 * blockSize) {
- Block b;
- b.data.assign(iter->data.begin(), iter->data.begin() + blockSize);
- blockList.insert(iter, b);
- iter->data.erase(iter->data.begin(), iter->data.begin() + blockSize );
- }
- }
- for(auto iter = blockList.begin(); iter != blockList.end(); iter ++) {
- auto nextIter = next(iter);
- if (nextIter != blockList.end() && iter->data.size() + nextIter->data.size() <blockSize) {
- iter->data.insert(iter->data.end(), nextIter->data.begin(), nextIter->data.end());
- iter = blockList.erase(nextIter);
- }
- }
- }
-
- blockIter find(int& pos) {
- int sum = 0;
- for(auto iter = blockList.begin(); iter != blockList.end(); iter ++) {
- sum += iter->data.size();
- if (sum>pos) {
- pos -= sum - iter->data.size();
- return iter;
- }
- }
- return blockList.end();
- }
-
- void erase(int pos){
- auto iter = find(pos);
- if (iter != blockList.end()) {
- totalSize --;
- blockSize = sqrt(totalSize);
- iter->data.erase(iter->data.begin() + pos);
- }
- maintain();t
- }
- char get(int pos) {
- auto iter = find(pos);
- if (iter == blockList.end()) return '.';
- else return iter->data[pos];
- }
-
- void print() {
- for(Block b : blockList) {
- cout << "| " ;
- for (char c : b.data) {
- cout << c << " ";
- }
- }
- cout <<endl;
- }
-
-
-
- };
- int main() {
- BlockList bl;
- bl.insert('a', 10);
- bl.insert('b', 10);
- bl.insert('c', 10);
- bl.insert('d', 10);
- bl.insert('e', 1);
- bl.insert('e', 1);
- bl.insert('e', 1);
- bl.insert('e', 1);
- bl.insert('e', 1);
- bl.print();
- cout << bl.get(7) << endl;
- bl.erase(7);
- bl.print();
- bl.erase(7);
- bl.erase(4);
- bl.erase(4);
- bl.print();
- bl.erase(3);
- bl.print();
- }
复制代码 |