++C -תכנות מכוון עצמים ו 12 יחידה STL – Standard Templates Library קרן כליף ביחידה זו נלמד: סקירת הSTL - סוגים של 'conatinerים איטרטור Object Functions אלגוריתמים המחלקה string 2 © Keren Kalif STL – Standard Template Library ה STL -הוא אוסף מימושים למבני-נתונים ואלגוריתמים בשפת ++C מימושים אלו מתבססים על templates בין מבני-הנתונים הממומשים ניתן למצוא: מערך רשימה מקושרת מפה קבוצה בין האלגוריתמים הממומשים ניתן למצוא: חיפוש מיון מינימום ומקסימום 3 © Keren Kalif - STLיתרונות שימוש בקוד מוכן לפעולות שכיחות ניהול זכרון מימושי האוספים השונים בעלי ממשק כמעט זהה מקל על למידתם מקל על החלפת שימוש אחד באחר בקישור הבא נתן למצוא את כל מה שה STL -מכיל http://www.sgi.com/tech/stl/table_of_contents.html 4 © Keren Kalif מבני הנתונים מה STL -שנסקור במצגת זו מבני נתונים שהם ( Sequences Containerפניה לאיבר לפי מיקומו) – vector מימוש למערך שיודע להגדיל את עצמו – list מימוש לרשימה מקושרת דו-כיוונית מבני נתונים שהם ( Associative Containerפניה לאיבר לפי מפתח) 5 – set מימוש לקבוצה בלי כפילות איברים .הנתונים שמורים בעץ בינארי – multiset כנ"ל ,אך מאפשר כפילות איברים – map מימוש למפה :אוסף של זוגות .key+value :לכל keyיהיה מפתח יחיד – multimap כנ"ל ,אבל לכל keyיכולים להיות כמה מפתחות © Keren Kalif Sequences Container 6 © Keren Kalif Sequences Container לכולם יש את המתודות הבאות (ועוד): פעולה שם המתודה ) void push_back(const T& valמקבלת ערך ומוסיפה העתק שלו לסוף האוסף bool empty() constמחזירה אמת אם באוסף אין איברים ,שקר אחרת T front() constמחזירה העתק של האיבר הראשון באוסף .עף אם האוסף ריק. )( void clearמרוקנת את כל איברי האוסף .עוברת ב d’tor -של כל איבר. יש לשים לב שאם האיברים הם מצביעים ,אינה משחררת אותם. )( void pop_backמורידה מהאוסף את האיבר האחרון ,ומשחררת אותו int size() constמחזירה את כמות האיברים באוסף (גודל לוגי) = operatorמימוש אופרטור השמה == operatorפונקציית friendהבודקת האם איברי האוסף זהים (גם בסדר) 7 © Keren Kalif )2( Sequences Container ל list -יש גם את המתודות הבאות: שם המתודה פעולה ) void push_front(const T& valמקבלת ערך ומוסיפה העתק שלו לתחילת האוסף )( void pop_frontמורידה מהאוסף את האיבר הראשון ,ומשחררת אותו ל vector -יש גם את המתודות: שם המתודה פעולה int capacity() constמחזירה את הגודל הפיזי של המערך ) void reserve(int nבמידה ו capacity < n -מגדילה את capacityבהתאם. משמש לצרכי יעילות. 8 © Keren Kalif )3( Sequences Container לכולם יש את המתודות הבאות (ועוד): פעולה שם המתודה iterator insert(iterator pos,הוספת הערך valלפני האיבר במיקום pos )const T& val void insert(iterator pos, int n,הוספת nערכים valלפני האיבר במיקום pos )const T& val ) iterator erase(iterator posמסירה את האיבר במיקום posומשחררת אותו iterator erase(iterator first,מסירה את כל האיברים בטווח בין firstל( last -לא )iterator last כולל )last איטרטורים: שם המתודה פעולה )( iterator beginמחזיר איטרטור לאיבר הראשון באוסף )( iterator endמחזיר איטרטור לאיבר אחרי האחרון באוסף 9 © Keren Kalif 1. int main() 2. } 3. vector<int> numbers; vector -דוגמא לשימוש ב // --> Collection is empty! 4. 5. cout << "Is collection empty? " << numbers.empty() << endl; // --> 1 cout << "size=" << numbers.size() << " capacity=" << numbers.capacity() << endl; // --> size=0 capacity=0 6. 7. numbers.push_back(4); cout << "size=" << numbers.size() << " capacity=" << numbers.capacity() << endl; // --> size=1 capacity=1 8. 9. 10. numbers.push_back(8); numbers.push_back(2); cout << "size=" << numbers.size() << " capacity=" // --> size=3 capacity=3 << numbers.capacity() << endl; 13. 14. cout << "Is collection empty? " << numbers.empty() << endl; // --> 0 cout << "size=" << numbers.size() << " capacity=" << numbers.capacity() << endl; // --> size=3 capacity=3 // values in the vector: 4 8 2 © Keren Kalif 10 )(המשך vector -דוגמא לשימוש ב 23. 24. int firstValue = numbers.front(); cout << "first value is " << firstValue << endl; // first value is 4, values in the vector: 4 8 2 25. 26. // values in the vector: 4 8 numbers.pop_back(); cout << "size=" << numbers.size() << " capacity=" // --> size=2 capacity=3 << numbers.capacity() << endl; 27. 28. numbers.reserve(10); cout << "size=" << numbers.size() << " capacity=" << numbers.capacity() << endl; // --> size=2 capacity=10 29. 30. numbers.clear(); cout << "size=" << numbers.size() << " capacity=" << numbers.capacity() << endl; // --> size=0 capacity=10 31. { © Keren Kalif 11 דוגמא לאוסף המכיל אובייקטים 12 © Keren Kalif איטרטורים © Keren Kalif 13 איטרטורים בכל מחלקה המממשת מבנה-נתונים ב STL -ממומשות 2מחלקות פנימיות iterator :וconst_iterator - איטרטור הוא אובייקט שמכיל הצבעה לאיבר מסויים באוסף לכן אנחנו מתייחסים לאיטרטור כמעין מצביע מחלקת האיטרטור מספקת מימשק למעבר על כל איברי האוסף באופן סדרתי בכל מחלקה המממשת מבנה נתונים יש את השיטות: – begin() המחזירה איטרטור לאיבר הראשון באוסף – end() המחזירה איטרטור לאיבר אחרי האחרון באוסף היתרון: החלפת מבנה-נתונים אחד באחר לא תגרור שינוי בשימוש כאשר מבנה הנתונים עליו רצים הוא constנעבוד עם 14 const_iterator © Keren Kalif 1. 2. 3. 4. 5. 6. 7. 8. דוגמא לשימוש באיטרטור #include <iostream> using namespace std; #include <vector> int main() } vector<int> v1; != שימוש באופרטור 9. 10. 11. v1.push_back(1); v1.push_back(3); v1.push_back(2); 12. 13. 14. 15. 16. 17. { vector<int>::iterator vector<int>::iterator for ( ; itr != itrEnd cout << *itr << " cout << endl; itr = v1.begin(); itrEnd = v1.end(); ++ שימוש באופרטור ; ++itr ) "; //// 11 3 2 * שימוש באופרטור v1: itr 1 3 2 itr itr itr itrEnd © Keren Kalif 15 שיטות שיש בכל מחלקת iterator אופרטור ++ מקדם את האיטרטור להכיל הצבעה לאיבר הבא באוסף אופרטור * מחזיר את התוכן של האיבר אליו האיטרטור מכיל הצבעה אופרטור == בודק ששני איטרטורים מכילים הצבעה לאותו איבר אופרטור =! בודק ששני איטרטורים אינם מכילים הצבעה לאותו איבר 16 © Keren Kalif דוגמאות לפונקציות המדפיסות אוספים כאשר האוסף עליו אנחנו רצים הוא ,constאו כאשר השיטה היא ,const יש להשתמש בconst_iterator - © Keren Kalif 17 פונקציית הדפסת כל אוסף © Keren Kalif 18 insert - ובerase -דוגמא לשימוש ב 1. void main() 2. { 3. list<int> numbers; itr: 4. 5. 6. numbers.push_back(1); numbers.push_back(2); numbers.push_front(3); 7. 8. 9. list<int>::iterator itr = numbers.begin(); ++itr; numbers.insert(itr, 4); 10. 11. numbers.insert(--numbers.end(), 5); printCollection(numbers); 12. 13. 14. ++itr; numbers.erase(itr); printCollection(numbers); 15. 16. } numbers.erase(itr); numbers: 3 4 1 5 2 2 2 // crashes! The iterator points to no-where.. © Keren Kalif 19 דוגמא למימוש איטרטור 20 © Keren Kalif Object Function 21 © Keren Kalif מהו Object Function בשפת Cיכולנו להגדיר פונקציה שאחד הפרמטרים שלה הוא מצביע לפונקציה כלומר ,אחד הפרמטרים הוא שם של פונקציה בעלת חתימה ספציפית ++C היא שפה מכוונת עצמים ,ולכן הדגש הוא על אובייקטים. במקום לשלוח שם של פונקציה ,נשלח אובייקט שיתאר את הפעולה שאנחנו רוצים לבצע במחלקה זו נעמיס את האופרטור() 22 © Keren Kalif דוגמא הגדרת ה template -יכולה להיות או אן על המחלקה כולה או רק על המתודה למחלקות אלו קוראים Object Functionמשום שתפקידו של האובייקט הוא לייצג פעולה 23 © Keren Kalif שימוש בObject Functions - פונקציה המקבלת 2איטרטורים ואובייקט המייצג פעולה אובייקטים זמניים 24 © Keren Kalif הפעלת אופרטור () של האובייקט fעל כל איבר בטווח דוגמאת מיון © Keren Kalif 25 שימוש במיון ניתן לשלוח במקום אובייקט עם העמסת () שם של פונקציה עם חתימה זהה 26 © Keren Kalif Associative Container © Keren Kalif 27 Associative Containers אלו מבני נתונים אשר ניתן לגשת אליהם עפ"י מפתח ,ולא בהכרח עפ"י אינדקס (מספר). מבני נתונים אלו ממוינים עפ"י המפתח ,לכן צריך לספק עבורם מתודה השוואה .במידה ולא נספק ,מבנה הנתונים ישתמש ב- ,defaultאם קיים ,אחרת יתן שגיאת קומפילציה 28 © Keren Kalif set set הוא מבנה נתונים לשמירת מפתחות בלבד .כל מפתח הוא יחודי .נסיון הוספה של מפתח קיים לא יבוצע. איברי ה set -ממוינים ומוחזקים בעץ בינארי multiset כמו setאך כל מפתח יכול להיות קיים יותר מפעם אחת כאשר נוריד איבר מהקבוצה ,במידה וקיימים כמה העתקים ,ירד רק מופע אחד שלו 29 © Keren Kalif 1. #include <set> דוגמא- set 2. void main() 3. } 4. set<int> intSet; 5. 6. intSet.insert(4); intSet.insert(2); intSet.insert(1); 7. intSet.insert(3); intSet.insert(1); 8. printCollection(intSet); // 1 2 3 4 9. 10. cout << "Is set empty? " << intSet.empty() << endl; // Is set empty? 0 11. cout << "Value 1 appears " << intSet.count(1) << " times\n"; 12. // Value 1 appears 1 times 13. cout << "Value 8 appears " << intSet.count(8) << " times\n"; 14. // Value 8 appears 0 times 15. intSet.erase(2); 16. printCollection(intSet); // 1 3 4 17. cout << "There are " << intSet.size() << " values in the set\n"; 18. // There are 3 values in the set 19. cout << "There can be max" << intSet.max_size() << " elements\n"; 20. // There can be max 1073741823 elements 21. set<int>::iterator itr = intSet.find(4); 22. if (itr != intSet.end()) 23. cout << "4 is found\n"; // 4 is found 24. 25. 26. } intSet.clear(); printCollection(intSet); // There cam be maximum can be 1073741823 © Keren Kalif 30 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. )2( – דוגמאset #include <iostream> using namespace std; #include <set> template <class T> void printCollection(const T& collection) { … } void main() } char* words[] = {"shalom", "kita", "alef", "shalom", "kita", "beit"}; set<char*> wordsSet; 19. 20. 21. 22. { int numOfWords = sizeof(words)/sizeof(words[0]); for (int i=0 ; i < numOfWords ; i++) wordsSet.insert(words[i]); printf("The words in the set:\n"); printCollection(wordsSet); // beit alef kita shalom wordsSet.clear(); printf("The words in the set after clear:\n"); printCollection(wordsSet); // Collection is empty! , היא אוסף ממויןset ההגדרה של ...אך בפועל אנחנו רואים שלא © Keren Kalif 31 מיון set בדוגמא הקודמת ראנו שאיברי ה set -אינם ממוינים כצפוי setממיין את איבריו בעזרת האופרטור > מאחר ואיברי ה set -בדוגמא הקודמת הם מטיפוס מצביע ,המיון נעשה לפי כתובתם ,ולא לפי תוכנם במידה ולא ממומש אופרטור > עבור ,Tנקבל שגיאת קומפילציה ניתן להגדיר setולספק כארגומנט אובייקט שייצג את פונקציית ההשוואה כאמור ,אובייקט כזה נקרא object functionונממש עבורו את האופרטור () 32 © Keren Kalif 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. #include <iostream> using namespace std; #include <set> )2( – דוגמאset מיון template <class T> void printCollection(const T& collection) {…} אובייקט המעמיס את אופרטור () ויודע class ltstr להשוות בין שני משתנים מטיפוס מחרוזת } public: bool operator()(const char* s1, const char* s2) const {return strcmp(s1, s2) < 0;} }; int main() { char* words[] = {"shalom", "kita", "alef", "shalom", "kita", "beit"}; int numOfWords = sizeof(words)/sizeof(words[0]); set<char*, ltstr> wordsSet; for (int i=0 ; i < numOfWords ; i++) wordsSet.insert(words[i]); יצירת האובייקט תכלול את האובייקט שיודע לבצע את ההשוואה printf("The words in the set:\n"); printCollection(wordsSet); // alef beit kita shalom { © Keren Kalif 33 map מבנה נתונים המכיל זוגות של keyוvalue - לכל keyיש מפתח יחיד .ניסיון הכנסה נוספת של keyקיים תדרוס את ה value -המקורי בעת הכנסה של keyקיים ,יש לבדוק האם צריך לשחרר את הזיכרון של ה value -הנוכחי multimap כמו mapאך כל מפתח יכול להיות קיים יותר מפעם אחת כאשר נוריד מפתח ,ירד ה value -הראשון 34 © Keren Kalif map -דוגמא לשימוש ב © Keren Kalif 35 )2( map -דוגמא לשימוש ב © Keren Kalif 36 דוגמא נוספת לשימוש בmap - (מתוך )STL Reference 37 האיברים מסודרים הפוך לסדר הכנסתם © Keren Kalif multimap -דוגמא לשימוש ב © Keren Kalif 38 אלגוריתמים © Keren Kalif 39 אלגוריתמים שנסקור: min_element, max_element sort reverse swap, itr_swap find, find_if יש להוסיף: >#include <algorithm אלו פונקציות גלובליות ,שהסינטקס של רובן הוא ששני הפרמטרים הראשונים שלהן הם טווח איברים עליהם תבוצע הפעולה (לרוב ,איטרטור beginואיטרטור (end 40 © Keren Kalif count, count_if for_each transform copy min_element, max_element 1. 2. #include <iostream> using namespace std; 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. #include <algorithm> #include <vector> int main() { vector<int> numbers; numbers.push_back(4); numbers.push_back(1); numbers.push_back(7); numbers.push_back(4); numbers.push_back(2); numbers.push_back(5); הפונקציות מקבלות איטרטור ומחזירותend - וbegin איטרטור לאיבר המתאים > יועמס האופרטורT -דורשות של vector<int>::iterator max = max_element(numbers.begin(), numbers.end()); cout << "The max is " << *max << endl; // --> The max is 7 vector<int>::iterator min = min_element(numbers.begin(), numbers.end()); cout << "The min is " << *min << endl; // --> The min is 1 { © Keren Kalif 41 sort 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. #include <iostream> using namespace std; #include <algorithm> #include <vector> int main() { vector<int> numbers; end - וbegin הפונקציה מקבלת איטרטור numbers.push_back(4); numbers.push_back(1); numbers.push_back(7); numbers.push_back(4); numbers.push_back(2); numbers.push_back(5); > יועמס האופרטורT -דורשת של // 4 1 7 4 2 5 sort(numbers.begin(), numbers.end()); { // 1 2 4 4 5 7 © Keren Kalif 42 reverse 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. #include <iostream> using namespace std; #include <algorithm> #include <vector> int main() { vector<int> numbers; numbers.push_back(4); numbers.push_back(1); numbers.push_back(7); numbers.push_back(4); numbers.push_back(2); numbers.push_back(5); end - וbegin הפונקציה מקבלת איטרטור הפונקציה מקבלת שני משתנים מאותו ומשתמשת באופרטור= שלהם // 4 1 7 4 2 5 reverse(numbers.begin(), numbers.end()); { // 5 2 4 7 1 4 © Keren Kalif 43 swap 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. #include <iostream> using namespace std; #include <algorithm> #include <vector> void main() { int x=2, y=3; swap(x, y); הפונקציה מקבלת שני משתנים מאותו ומשתמשת באופרטור= שלהם // x=2, y=3 // x=3, y=2 { char str1[10]=“hello”, str2[10]=“world”; swap(str1, str2); // doesn’t compile, can’t change addresses © Keren Kalif 44 itr_swap 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. #include <iostream> using namespace std; #include <algorithm> #include <vector> int main() { vector<int> numbers; numbers.push_back(4); numbers.push_back(1); numbers.push_back(7); numbers.push_back(4); numbers.push_back(2); numbers.push_back(5); itr_swap(numbers.begin(), { איטרטורים2 הפונקציה מקבלת ומחליפה את תוכנם T הפונקציה משתמשת באופרטור= של // 4 1 7 4 2 5 ++(numbers.begin()); // 1 4 7 4 2 5 © Keren Kalif 45 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. find #include <algorithm> #include <vector> int main() { vector<int> numbers; numbers.push_back(4); numbers.push_back(1); numbers.push_back(7); numbers.push_back(4); numbers.push_back(2); numbers.push_back(5); , begin הפונקציה מקבלת איטרטור ומחזירה, ואיבר לחיפושend איטרטור איטרטור לאיבר הראשון באוסף שזהה לאיבר == יועמס האופרטורT -דורשת של vector<int>::iterator found = find(numbers.begin(), numbers.end(), 8); if (found == numbers.end()) cout << "value doesn't exist\n"; else cout << "value exists\n"; found = find(numbers.begin(), numbers.end(), 7); if (found == numbers.end()) cout << "value doesn't exist\n"; else cout << "value exists\n"; { © Keren Kalif 46 1. 2. 3. 4. #include <algorithm> #include <vector> bool isOdd(int num) {return num%2==1;} find_if אפשר לשלוח,במקום פונקציה Object Function גם 5. int main() 6. { 7. vector<int> numbers; 8. איטרטור, begin הפונקציה מקבלת איטרטור 9. numbers.push_back(4); ומחזירהT ושם של פונקציה המקבלתend 10. numbers.push_back(1); ומחזירה איטרטור לאיבר הראשון,bool 11. numbers.push_back(7); true באוסף שהפעלת הפונקציה עליו מחזירה 12. numbers.push_back(4); 13. numbers.push_back(2); 14. numbers.push_back(5); == יועמס האופרטורT -דורשת של 15. 16. vector<int>::iterator found = 17. find_if(numbers.begin(), numbers.end(), isOdd); 18. 19. if (found == numbers.end()) 20. cout << “No value is odd\n"; 21. else 22. cout << "value exists: " << *found << "\n"; // value exists: 1 23. { © Keren Kalif 47 count 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. #include <iostream> using namespace std; #include <algorithm> #include <vector> int main() { vector<int> numbers; numbers.push_back(4); numbers.push_back(1); numbers.push_back(7); numbers.push_back(4); numbers.push_back(2); numbers.push_back(5); , begin הפונקציה מקבלת איטרטור ומחזירה, ואיבר לחיפושend איטרטור את כמות המופעים שלו באוסף == יועמס האופרטורT -דורשת של int num4 = count(numbers.begin(), numbers.end(), 4); cout << "4 appears " << num4 << "times\n"; // 4 appears 2 times { © Keren Kalif 48 count_if 1. 2. 3. 4. 5. #include <iostream> using namespace std; 6. bool isOdd(int num) {return num%2==1;} #include <algorithm> #include <vector> 7. int main() 8. { איטרטור, begin הפונקציה מקבלת איטרטור 9. vector<int> numbers; ומחזירהT ושם של פונקציה המקבלתend 10. ומחזירה את כמות האיברים באוסף,bool 11. numbers.push_back(4); true שהפעלת הפונקציה עליהם מחזירה 12. numbers.push_back(1); 13. numbers.push_back(7); 14. numbers.push_back(4); == יועמס האופרטורT -דורשת של 15. numbers.push_back(2); 16. numbers.push_back(5); 17. 18. int numOfOdd = count_if(numbers.begin(), numbers.end(), isOdd); 19. cout << "There are " << numOfOdd << " odd values\n"; 20. // There are 3 odd values 49 21. { © Keren Kalif for_each 1. 2. 3. 4. 5. 6. 7. #include <iostream> using namespace std; #include <algorithm> #include <vector> void print(int num) {cout << num << " ";} 8. int main() 9. { 10. vector<int> numbers; איטרטור, begin הפונקציה מקבלת איטרטור 11. 12. numbers.push_back(4); ושאינהT ושם של פונקציה המקבלתend 13. numbers.push_back(2); מפעילה את הפונקציהfor_each .מחזירה דבר 14. numbers.push_back(7); שהתקבלה על כל אחד מאיברי הטווח 15. numbers.push_back(4); 16. numbers.push_back(2); 17. numbers.push_back(5); 18. 19. for_each(numbers.begin(), numbers.end(), print); // 4 2 7 4 2 5 20. { © Keren Kalif 50 transform 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. #include <algorithm> #include <vector> #include <list> ,שולחת כל איבר בטווח לפונקציה המבוקשת ואת התוצאה מוסיפה לאוסף השני int square(int num) {return num*num;} int main() { std::list<int> std::vector<int> 15. 16. 17. 18. } intList; intArr; for (int i=1; i<=5; ++i) intList.push_back(i); // intList: 1 2 3 4 5 // int arr: std::transform (intList.begin(), intList.end(), std::back_inserter(intArr), square); הפונקציה לחישוב טווח איברים עליו נעבוד האוסף אליו נוסיף את התוצאה ומיקום ההוספה // intList: 1 2 3 4 5 // int arr: 1 4 9 16 25 © Keren Kalif 51 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. copy #include <iostream> using namespace std; #include <algorithm> #include <vector> #include <list> הפונקציה מקבלת טווח איטרטורים וסדר ) ומוסיפהfront/back( הוספה לאוסף אחר את כל האיברים בטווח לאוסף האחר int main() { vector<int> numbers; list<int> frontIntList, backIntList; numbers.push_back(4); numbers.push_back(2); numbers.push_back(7); numbers.push_back(4); numbers.push_back(2); numbers.push_back(5); copy(numbers.begin(), numbers.end(), back_inserter(backIntList)); copy(numbers.begin(), numbers.end(), front_inserter(frontIntList)); { // backIntList: 4 2 7 4 2 5 // frontIntList: 5 2 4 7 2 4 © Keren Kalif 52 לצורך הדפסהcopy -שימוש ב 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. #include <iostream> using namespace std; #include <algorithm> #include <vector> #include <list> int main() { vector<int> numbers; list<int> frontIntList, backIntList; numbers.push_back(4); numbers.push_back(2); numbers.push_back(7); numbers.push_back(4); numbers.push_back(2); numbers.push_back(5); כותב איברים מטיפוסostream_inserter עם מפריד '_' בין האיברים, למסךT copy(numbers.begin(), numbers.end(), ostream_iterator<int>(cout, "_")); printf(“\n”); { © Keren Kalif 53 string המחלקה © Keren Kalif 54 ביחידה זו למדנו: סקירת הSTL - סוגים של 'conatinerים איטרטור Object Functions אלגוריתמים המחלקה string 55 © Keren Kalif
© Copyright 2024