// merge()の使用例 #include < iostream> #include < list> using namespace std; int main() { list< int> lst1, lst2; int i; for(i=0; i<10; i+=2) lst1.push_back(i); for(i=1; i<11; i+=2) lst2.push_back(i); cout << "Original size of lst1: "; cout << lst1.size() << "\n"; cout << "Original contents of lst1:\n"; list< int>::iterator p = lst1.begin(); while(p != lst1.end()) cout << *p++ << " "; cout << "\n\n"; cout << "Original size of lst2: "; cout << lst2.size() << "\n"; cout << "Original contents of lst2:\n"; p = lst2.begin(); while(p != lst2.end()) cout << *p++ << " "; cout << "\n\n"; // 2つのリストを混合する lst1.merge(lst2); cout << "Size of lst1 after merge: "; cout << lst1.size() << "\n"; cout << "Merged contents of lst1:\n"; p = lst1.begin(); while(p != lst1.end()) cout << *p++ << " "; cout << "\n\n"; cout << "lst2 is now empty, its size is "; cout << lst2.size() << "\n"; return 0; }
// リストがソートされていないと混合は正しく行われない #include < iostream> #include < list> using namespace std; int main() { list< int> lst1, lst2; int i; lst1.push_back(2); lst1.push_back(0); lst1.push_back(8); lst1.push_back(4); lst1.push_back(6); for(i=1; i<11; i+=2) lst2.push_back(i); cout << "Original contents of lst1:\n"; list< int>::iterator p = lst1.begin(); while(p != lst1.end()) cout << *p++ << " "; cout << "\n\n"; cout << "Original contents of lst2:\n"; p = lst2.begin(); while(p != lst2.end()) cout << *p++ << " "; cout << "\n\n"; // この操作は失敗する lst1.merge(lst2); cout << "Contents of lst1 after failed merge:\n"; p = lst1.begin(); while(p != lst1.end()) cout << *p++ << " "; cout << "\n\n"; return 0; }
// 降順に混合する #include < iostream> #include < list> using namespace std; int main() { list< int> lst1, lst2; int i; for(i=10; i>=0; i-=2) lst1.push_back(i); for(i=11; i>=1; i-=2) lst2.push_back(i); cout << "Original contents of lst1:\n"; list< int>::iterator p = lst1.begin(); while(p != lst1.end()) cout << *p++ << " "; cout << "\n\n"; cout << "Original contents of lst2:\n"; p = lst2.begin(); while(p != lst2.end()) cout << *p++ << " "; cout << "\n\n"; // "<"ではなくgreater()を使って混合する lst1.merge(lst2, greater< int>()); cout << "Merged contents of lst1:\n"; p = lst1.begin(); while(p != lst1.end()) cout << *p++ << " "; cout << "\n\n"; return 0; }
// 結合の例 #include < iostream> #include < list> #include < string> #include < algorithm> using namespace std; int main() { list< string> sentence; list< string> phrase; list< string>::iterator p; string s1[] = { "occur", "at", "" }; string s2[] = { "Splicing", "can", "" }; string s3[] = { "or", "the", "end.", "" }; string s4[] = { "the", "front,", "the", "middle,", "" }; int i; // 初期状態の文を作成する for(i=0; s1[i]!=""; i++) sentence.push_back(s1[i]); // 追加する最初の句を作成する for(i=0; s2[i]!=""; i++) phrase.push_back(s2[i]); cout << "Original sentence:\n"; p = sentence.begin(); while(p != sentence.end()) cout << *p++ << " "; cout << "\n\n"; // 先頭に結合する sentence.splice(sentence.begin(), phrase); cout << "Sentence after splicing at the front:\n"; p = sentence.begin(); while(p != sentence.end()) cout << *p++ << " "; cout << "\n\n"; // 次の句を作成する for(i=0; s3[i]!=""; i++) phrase.push_back(s3[i]); // 末尾に結合する sentence.splice(sentence.end(), phrase); cout << "Sentence after splicing at the end:\n"; p = sentence.begin(); while(p != sentence.end()) cout << *p++ << " "; cout << "\n\n"; // 最後の句を作成する for(i=0; s4[i]!=""; i++) phrase.push_back(s4[i]); // "or" の前に句を結合する p = find(sentence.begin(), sentence.end(), "or"); sentence.splice(p, phrase); cout << "Sentence after splicing in the middle:\n"; p = sentence.begin(); while(p != sentence.end()) cout << *p++ << " "; return 0; }
// リストをソートする #include < iostream> #include < list> #include < cstdlib> using namespace std; int main() { list< int> lst; int i; // ランダムな整数のリストを作成する for(i=0; i<10; i++) lst.push_back(rand()); cout << "Original contents:\n"; list< int>::iterator p = lst.begin(); while(p != lst.end()) { cout << *p << " "; p++; } cout << "\n\n"; // リストをソートする lst.sort(); cout << "Sorted contents:\n"; p = lst.begin(); while(p != lst.end()) { cout << *p << " "; p++; } return 0; }
// remove()の使用例 #include < iostream> #include < list> using namespace std; int main() { list< int> lst; list< int>::iterator p; int i; for(i=0; i<20; i++) lst.push_back(i%3); cout << "Original list: "; for(p=lst.begin(); p!=lst.end(); p++) cout << *p << " "; cout << "\n\n"; lst.remove(1); // すべての1を削除する cout << "Modified list: "; for(p=lst.begin(); p!=lst.end(); p++) cout << *p << " "; cout << "\n\n"; return 0; }
// unique()の使用例 #include < iostream> #include < list> using namespace std; int main() { list< int> lst; list< int>::iterator p; for(int i=0; i<5; i++) for(int j=0; j<3; j++) lst.push_back(i); cout << "Orignal list: "; for(p=lst.begin(); p!=lst.end(); p++) cout << *p << " "; cout << "\n\n"; lst.unique(); // 連続する重複要素を削除する cout << "Modified list: "; for(p=lst.begin(); p!=lst.end(); p++) cout << *p << " "; cout << "\n\n"; return 0; }
// reverse()を使った回文テスター #include < iostream> #include < list> using namespace std; char phrases[][80] = { "Madam, I'm Adam.", "Able was I ere I saw Elba.", "A man, a plan, a canal: Panama!", "This is not one.", "" }; int main() { list< char> pal; int i, j; list< char>::iterator p; for(i=0; *phrases[i]; i++) { for(j=0; phrases[i][j]; j++) pal.push_back(phrases[i][j]); cout << "Phrase # " << i << " forward: "; p = pal.begin(); while(p != pal.end()) cout << *p++; cout << "\n"; // 関係のない文字を削除する pal.remove(','); pal.remove('.'); pal.remove('!'); pal.remove(':'); pal.remove('\''); pal.remove(' '); cout << "Phrase # " << i << " after deletions: "; p = pal.begin(); while(p != pal.end()) cout << *p++; cout << "\n"; pal.reverse(); // リストを反転する cout << "Phrase # " << i << " backward: "; p = pal.begin(); while(p != pal.end()) cout << *p++; cout << "\n\n"; pal.clear(); // 次の文を試す準備 } return 0; }
// メールアドレスをリストに格納する #include < iostream> #include < list> #include < string> using namespace std; class maillist { string name; string street; string city; string state; string zip; public: maillist() { name = street = city = state = zip = ""; } maillist(string n, string s, string c, string st, string z) { name = n; street = s; city = c; state = st; zip = z; } string getname() { return name; } string getcity() { return city; } string getstreet() { return street; } string getstate() { return state; } string getzip() { return zip; } }; // リストを名前でソートするために必要 bool operator<(maillist &a, maillist &b) { return a.getname() < b.getname(); } // リストから名前を検索するために必要 bool operator==(maillist &a, maillist &b) { return a.getname() == b.getname(); } // リストを画面に表示する void display(list< maillist> &lst) { list< maillist>::iterator p; for(p=lst.begin(); p!=lst.end(); p++) { cout << p->getname() << ": "; cout << p->getstreet() << ", "; cout << p->getcity() << ", "; cout << p->getstate() << " "; cout << p->getzip() << "\n"; } } int main() { list< maillist> mlstA, mlstB; mlstA.push_back(maillist("James, Tom", "1102 W. Henry St", "Mission", "TX", "78572")); mlstA.push_back(maillist("Newton, Sid", "55 Oscar Blvd", "Kirksville", "MO", "63501")); mlstA.push_back(maillist("Henson, Erick", "908 Trunk Ave", "Peoria", "IL", "61615")); mlstA.push_back(maillist("Ewen, Heidi", "43645 N. Broadway #4", "Idaho Falls", "ID", "83401")); mlstA.push_back(maillist("Mount, W. C.", "78A Wothington Rd", "Berkeley", "CA", "94710")); mlstB.push_back(maillist("Williams, Don", "197 NorthRidge Dr", "Walworth", "WI", "53184")); mlstB.push_back(maillist("Newton, Sid", "55 Oscar Blvd", "Kirksville", "MO", "63501")); mlstB.push_back(maillist("Ewen, Heidi", "43645 N. Broadway #4", "Idaho Falls", "ID", "83401")); mlstB.push_back(maillist("Weston, George", "5464 Woodbury Ct", "Baker", "LA", "70714")); mlstA.sort(); mlstB.sort(); // メーリングリストを混合する mlstA.merge(mlstB); cout << "List A after sorting and merging.\n"; display(mlstA); cout << "List A now has " << mlstA.size(); cout << " entries.\n\n"; // 重複要素を削除する mlstA.unique(); cout << "List A after removing duplicates.\n"; display(mlstA); cout << "List A now has " << mlstA.size(); cout << " entries.\n\n"; return 0; }