bloggerads

2013年10月31日 星期四

C++: vector Shuffle(洗牌) 函數

C++提供隨機打亂vector的函數, random_shuffle()。若想要每次第一次都是不同的亂法,可以引入一個function pointer, 而這個function限定一個輸入和一個輸出引數, type要和iterator一樣, 且輸出值不能為負數或大於輸入引數

#include <stdio.h>
#include <vector>
#include <algorithm> //random_shuffle
#include <time.h>

int gen(int i) {return rand()%i; }

int main()
{ 
  srand(time(0));
  std::vector<int> v;
  v.push_back(1);
  v.push_back(2);
  v.push_back(3);
  v.push_back(4);

  random_shuffle(v.begin(), v.end(), gen);

  for (unsigned int x=0; x<v.size(); x++)
    printf("%d\n", v[x]);
  return 0;         
}

2013年10月30日 星期三

C++的Container: Vector使用範例

一般C語言如果想要動態增加陣列大小,則必須要呼叫 realloc()。C++提供了vector更靈活的使用陣列,請參考如下的範例:

#include <stdio.h>
#include <vector>

void print(char x, std::vector<int> &vec) // Call by Reference
{
    printf("%c.", x);
    for (int i=0; i<vec.size(); i++)
        printf(" %d", vec[i]);
    puts("");
}

int main()
{  
   std::vector<int> vec;// vector<int> vec(10, 0); //初始size為10個0
   std::vector<int>::iterator end;
     
   vec.push_back(10);  print('a', vec);
   vec.push_back(20);  print('b', vec);
   vec.insert(vec.begin() + 1, 30); // 將30插入陣列中第1個位置
   //vec.insert(vec.begin() + 1, 2, 30); // 將兩個30插入陣列中第1個位置
   print('c', vec);
   //auto end=vec.end()-1;     //  -std=c++11 
   vec.erase(end=vec.end()-1); // 移除最後一個元素
   print('d', vec);
   vec.pop_back();    // 移除最後一個元素
   print('f', vec);
   
   return 0;
}


輸出:
a. 10
b. 10 20
c. 10 30 20
d. 10 30
f. 10

2013年10月28日 星期一

C++的Container: List使用範例

#include<list>
#include<iostream>
#include<stdio.h>
using namespace std;

#define  OFFSET_ITERATOR(iterator, offset)  {\
  iterator = obj1.begin(); \
  for (int i=0; i<offset; i++) \
  iterator++;\
 } //將intertaor移動到offset的節點上


void show_list();

list<int> obj1;//建一個空的list對像
list<int>::iterator j;
list<int>::iterator k;

int main(void)
{

   for(int i=0;i<10;i++)
       obj1.push_front(i);

   show_list();

   // Remove first node (pop front)     
   obj1.pop_front();  printf(">obj1.pop_front();\n");
   show_list();
   
   // Remove node
   OFFSET_ITERATOR(j, 4);
   obj1.erase(j);    printf(">obj1.erase(4); //delete node: j-1, i.e. 4\n");
   show_list();
  
   // Insert node 
   OFFSET_ITERATOR(j, 4);
   obj1.insert(j, 55);  printf(">obj1.insert(4, 55);\n");
   show_list();
   
   // Remove node from j to k-1, where (j, k)=(2, 4)
   OFFSET_ITERATOR(j, 2);
   OFFSET_ITERATOR(k, 4);
   obj1.erase(j, k);     printf(">obj1.erase(2, 3); //delete node: j~k-1, i.e. 2~3\n");
   show_list();
   
   system("pause");
   return 0;
}

void show_list()
{
   for (j=obj1.begin(); j!=obj1.end(); j++)
      cout<< *j <<"  ";
    printf("\n");
}