7月
18
2007
分類:
最近更新:
2007-07-18
STL Vector/Map 的使用練習, 附 Ruby 對照程式碼
最近在練習使用 C++ STL 中的 Container 功能。嗯,寫著寫著,覺得很不順手啊。例如不能用 Vector/Set/Map 直接建表。Stack 的 pop() 方法沒有回傳值;我用 C 寫的 stack 功能, pop() 是會推一個值出來的。
挑了兩個 STL Container 的練習程式碼,再用 Ruby 寫一段相同的。兩相比較,也算在吐槽吧。
Vector 練習
把字元陣列的內容放入 Vector 容器 vec 中。將 vec 中的每個字元都轉換成大寫字母,最後倒著顯示。
輸出結果如下:
H e l l o O L L E H
C++: 21-3.cc
不接受 vector vec("Hello")
的寫法。每次要建立一個容器時,總少不了重覆的存入動作程式碼。
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<char> vec;
char* ps;
for (char* ps = "Hello"; *ps != '\0'; ++ps) {
vec.push_back(*ps);
}
vector<char>::iterator iter;
for (iter = vec.begin(); iter != vec.end(); ++iter) {
cout << *iter << endl;
}
int n = vec.size();
for (int i = 0; i < n; ++i) {
if (vec[i] >= 'a' && vec[i] <= 'z')
vec[i] -= 0x20;
}
vector<char>::reverse_iterator riter;
for (riter = vec.rbegin(); riter != vec.rend(); ++riter) {
cout << *riter << endl;
}
return 0;
}
Ruby: 21-3.rb
vec = "Hello"
vec.split('').each do |c|
puts c
end
vec.upcase!
vec.split('').reverse_each do |c|
puts c
end
Map 練習
用 Map 建立一個顏色名稱與 RGB 代碼的對照表。輸出結果如下列:
blue => #0000ff red => #ff0000 green => #00ff00 black => #ffffff white => #000 'blue' Find! It's value is #0000ff
C++: 22-2.cc
原本用 C 字串陣列,後來改用 String
陣列。然而這個陣列 ss 只是「初始值」,還要重覆將這些初始值存入 Map 容器 myMap 中的程式碼。
#include <iostream>
#include <iomanip>
#include <string>
#include <map>
using namespace std;
int main() {
/*char* ss[][2] = {
{"black", "#ffffff"},
{"white", "#000"},
{"blue", "#0000ff"},
{"red", "#ff0000"},
{"green", "#00ff00"},
{NULL, NULL}
};*/
string ss[][2] = {
{"black", "#ffffff"},
{"white", "#000"},
{"blue", "#0000ff"},
{"red", "#ff0000"},
{"green", "#00ff00"},
{"", ""}
};
map<string, string> myMap;
map<string, string>::iterator iter;
//for (int i = 0; ss[i][0]; ++i)
for (int i = 0; !ss[i][0].empty(); ++i)
myMap.insert(map<string,string>::value_type(ss[i][0], ss[i][1]));
for (iter = myMap.begin(); iter != myMap.end(); ++iter) {
cout << setiosflags(ios::left) << setw(10) << (*iter).first
<< " => " << setw(7) << (*iter).second << endl;
}
if ((iter = myMap.find("blue")) != myMap.end()) {
cout << "'blue' Find! It's value is " << (*iter).second << endl;
}
return 0;
}
Ruby: 22-2.rb
Ruby 可以直接建立對照表,不需要另外建立容器。
ss = {
:black => "#ffffff",
:white => "#000",
:blue => "#0000ff",
:red => "#ff0000",
:green => "#00ff00"
};
ss.each do |key, value|
printf "%-10s => %-10s\n", key, value
# Data type is dynamic, so printf in Ruby is safe.
end
if (ss['blue'.to_sym])
puts "'blue' Find! It's value is #{ss[:blue]}"
end
樂多舊網址: http://blog.roodo.com/rocksaying/archives/3679815.html
樂多舊回應