Void main(). string mas[] = {"111","222","333","444","555"};
{
string mas[] = {"111","222","333","444","555"};
string raz = "--------------------------\n";
int i;
for(i=0;i<5;i++)cout<<mas[i]<<" ";
cout << endl;
cout << raz;
vector <int> vec1;
vector <int> vec11;
vector <char*> vec2;
vector <st> vec3;
vector<int>::iterator t1;
vector<int>::iterator t11;
vector<char*>::iterator t2;
vector<st>::iterator t3;
for(i = 1; i < 11;i++)
{vec1.push_back (i);vec11.push_back (i);}
t1 = vec1.begin();
t11 = vec11.begin();
vec1.insert(t1,t11+1,t11 + 5);
for (t1 = vec1.begin();t1 != vec1.end();t1++)
cout <<*t1<<" " ;
cout << endl<< raz;
vec1.reserve(100);
cout<< vec1.size()<< "\n";
vec1.resize(10,10);
cout<<vec1.size() << "\n"<< raz;
for (t1 = vec1.begin();t1 != vec1.end();t1++)
cout <<*t1<<" " ;
cout <<endl << raz ;
t2 = vec2. begin();
vec2.insert(t2,"ttt");
for (i = 0; i < 3; i++)
vec2.push_back((char*)mas[i].c_str ());
cout<<vec2.front()<<" " <<vec2.back()<<endl<< raz ;
for (i = 0,t2 = vec2.begin();t2 != vec2.end();t2++)
{
cout <<*t2<<" "<<vec2[i]<<" " << vec2.at(i)<<"\n";
i++;
}
cout << raz;
vec2.erase(vec2.begin());
for (t2 = vec2.begin();t2 != vec2.end();t2++)
cout <<*t2<<"\n";
cout << raz;
st nn;
nn.a = 10;
strcpy (nn.mas,"aaa");
vec3.push_back(nn);
nn.a = 20;
strcpy (nn.mas,"bbb");
vec3.push_back(nn);
i = 0;
for (t3 = vec3.begin();t3 != vec3.end();t3++)
{
cout<<vec3[i].a <<" "<<vec3.at(i).mas
<<" "<<(*t3).mas <<"\n";
i++;
}
}
Результат роботи програми:
111 222 333 444 555
---------------------------------------------
2 3 4 5 1 2 3 4 5 6 7 8 9 10
---------------------------------------------
----------------------------------------------
2 3 4 5 1 2 3 4 5 6
----------------------------------------------
ttt 333
----------------------------------------------
ttt ttt ttt
111 111 111
222 222 222
333 333 333
----------------------------------------------
----------------------------------------------
10 aaa aaa
20 bbb bbb
В даному прикладі приводяться описані вище методи. Він приведений для закріплення матеріалу роботи з вектором.
10.2.2. Двосторонні черги (deque)
Двостороння черга – це послідовний контейнер, який, разом з вектором, підтримує довільний доступ до елементів і забезпечує вставку і видалення з обох кінців черги за постійний час. Ті ж операції з елементами усередині черги займають час, пропорційний кількості переміщуваних елементів. Розподіл пам'яті виконується автоматично. Розглянемо схему організації черги (рис. 10.1). Для того, щоб забезпечити довільний доступ до елементів за постійний час, черга розбита на блоки, доступ до кожного з яких здійснюється через вказівку. На рисунку замальовані області відповідають зайнятим елементам черги. Якщо при додаванні в початок або в кінець блок виявляється заповненим, виділяється пам'ять під черговий блок (наприклад, після заповнення блоку 4 буде виділена пам'ять під блок 5, а після заповнення блоку 2 – під блок 1). При заповненні крайнього з блоків відбувається перерозподіл пам'яті під масив вказівок так, щоб використовувалися тільки середні елементи. Це не займає багато часу. Таким чином, доступ до елементів черги здійснюється за постійний час, хоча він і дещо більше, ніж для вектора.
Для створення двосторонньої черги можна скористатися наступними конструкторами (приведений спрощений запис), аналогічними конструкторам вектора:
explicit deque(); //1
explicit deque(size_type n, const Т& value = T());//2
template <class InputIter> //3
deque(InputIter first , InputIter last);
deque(const vector <T>& x); //4
Рис. 10.1. Організація двосторонньої черги
Конструктор 1 є конструктором за умовчанням. Конструктор 2 створює чергу довжиною n і заповнює її однаковими елементами-копіями value. Конструктор 3 створює чергу шляхом копіювання вказаного за допомогою ітераторів діапазону елементів. Тип ітераторів має бути "для читання". Конструктор 4 є конструктором копіювання.
Приклади конструкторів:
// Створюється черга з 10 рівних одиниці елементів
deque <int> d2 (10, 1);
// Створюється черга, рівна черзі v1
deque <int> d4 ( v1 );
// Створюється черга з двох елементів, рівних першим двом
// елементам вектора v1 з попереднього розділу
deque <int> d3 (v1.begin(), v1.begin() + 2);
// Створюється черга з 10 об'єктів класу monstr
// (працює конструктор за умовчанням)
deque <monstr> m1 (10);
// Створюється черга з 5 об'єктів класу monstr із заданим ім'ям
// (працює конструктор з параметром char*)
deque <monstr> m2 (5, monstr("Bacя в очереди"));
У шаблоні deque визначені операція привласнення, функція копіювання, ітератори, операції порівняння, операції і функції доступу до елементів і зміни об'єктів, аналогічні відповідним операціям і функціям вектора. Вставка і видалення так само, як і для вектора, виконуються за пропорційний кількості елементів час. Якщо ці операції виконуються над внутрішніми елементами черги, всі значення ітераторів та посилань на елементи черги стають недійсними. Після операцій додавання в будь-який з кінців всі значення ітераторів стають недійсними, а значення посилань на елементи черги зберігаються. Після операції вибірки з будь-якого кінця стають недійсними тільки значення ітераторів і посилань, пов'язаних з цими елементами. Окрім перерахованих, визначені функції додавання та вибірки з початку черги:
void push_front(const Т& value);
void pop_front();
При вибірці елемент видаляється з черги. Для черги не визначені функції місткість і резерв, але є функції перевизначення та розмір.
Дата добавления: 2014-12-26; просмотров: 803;