Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

вопросы по С++

8.2K
18 марта 2007 года
user1
71 / / 16.03.2007
по ходу пограммирования у меня возникли некоры вопросы.
Кто знает прошу: ответьте !

1. Как из контейнера vector переписать текущее значение в массив char ?????

2. Как из контейнера multimap переписать текущее значение в массив char ???

3. Какой оператор позволяет вводить в переменные типа string предложения с пробелами ??

вроде все.
а потом - посмотрим.
:) :o
63
18 марта 2007 года
Zorkus
2.6K / / 04.11.2006
Цитата: user1

1. Как из контейнера vector переписать текущее значение в массив char ?????


В цикле перебрать и скопировать.

Цитата: user1

2. Как из контейнера multimap переписать текущее значение в массив char ???


Аналогично, пример кода:

 
Код:
multimap<string , int> m;
    m.insert(make_pair("B" , 212));
    m.insert(make_pair("A" , 232));
    m.insert(make_pair("C" , 7676));
    multimap<string , int>::iterator p = m.begin();
    while(p != m.end())
    {
             // через p->first и p->second копируешь, что нужно куда нужно
    }

Цитата: user1

3. Какой оператор позволяет вводить в переменные типа string предложения с пробелами ??


Например, семейство gets функций. копируешь в char array, и потом создаешь по ним строку. А можно считывать лексемы, пока не кончится поток cin, и их конкатенировать к какой-то строке.

361
18 марта 2007 года
Odissey_
661 / / 19.09.2006
Цитата:
В цикле перебрать и скопировать.


Надежный вариант. Железный.
Но, если пожертвовать переносимостью STL, вроде не все STL поддеживают последовательное размещение в памяти вектора, то можно к примеру так -

Код:
#include <vector>
#include <string>
#include <stdio.h>

using namespace std;

int main()
{
    char i;
    vector<char> d;
    char array_char[10]={0};
    for(i = 0; i <10; i++)
        d.push_back(i);
       
    memcpy(array_char, &d[0], sizeof(char)*10);
   
    for(i = 0; i <10; i++)
        printf("%d\n",array_char);
    return 0;
}
63
18 марта 2007 года
Zorkus
2.6K / / 04.11.2006
Цитата: Odissey_
Надежный вариант. Железный.
Но, если пожертвовать переносимостью STL, вроде не все STL поддеживают последовательное размещение в памяти вектора, то можно к примеру так -


А разве не всегда элементы последовательно расположены?

4.9K
19 марта 2007 года
efferson
57 / / 08.12.2005
Прошу прощения, но, на сколько я понимаю, к примеру шаблон <vector> всего-лишь эмулирует работу линейного списка: т.е. когда количество записей в контейнере станет больше, чем описано в свойстве capasity данного экземпляра - происходит дополнительное выделение оперативной памяти, которая пристыковывается аля новое звено линейного списка. Естественно, что ни new, ни malloc не обещают Вам последовательного выделения памяти (в принципе - они вобще выделения памяти не обещают: это не операторы, а операции, которые могут завершиться и неудачно... допустим, кончилась память). По сему в теории всегда существует вероятность, что память будет выделена не последовательно.... хотя на практике мне сталкиваться приходилось довольно редко, и то - это были случаи, когда объём требуемой памяти сопоставлялся с объёмом имеющейся... :)
361
19 марта 2007 года
Odissey_
661 / / 19.09.2006
Верно, хотя последовательное размещение может быть гарантировано, и при остуствии такового мог бы кидатся к примеру экспешн.

Вообще в стандарте нашел только упоминание о времени доступа к элементам вектора, о константном для втавки и удалении в конец вектора и линейном о вставки, удалении в середину вектора.

Вот что пишет о этом Страуструп
Цитата:
Но почему же компилятор не может найти число элементов вектора из объема выделенной памяти? Потому, что распределитель свободной памяти не является частью языка и может быть задан программистом.



Так что гарантия последовательного размещения в памяти самим стандартом не определена. Ну и как верно заметил efferson, это не всегда возможно.

240
19 марта 2007 года
aks
2.5K / / 14.07.2006
Цитата: efferson
Прошу прощения, но, на сколько я понимаю, к примеру шаблон <vector> всего-лишь эмулирует работу линейного списка


Не списка только - как раз вектор то эмулирует не список, а именно вектор или массив если хотите. Это разные при исспользовании вещи.

1.8K
19 марта 2007 года
k3Eahn
365 / / 19.12.2005
Цитата: Odissey_

Так что гарантия последовательного размещения в памяти самим стандартом не определена.



[quote=Standard]The elements of a
vector are stored contiguously, meaning that if v is a vector<T, Allocator> where T is some type
other than bool, then it obeys the identity &v[n] == &v[0] + n for all 0 <= n < v.size().[/quote]
Хм, сказано, что последовательно и при этом дано условие, при выполнении которого элементы считаются последовательно расположенными.
Опять же стандарт:

Цитата:

template <class T, class Allocator = allocator<T> >
class vector {
public:
// types:
typedef typename Allocator::reference reference;
typedef typename Allocator::const_reference const_reference;

...

// element access:
reference operator[](size_type n);
const_reference operator[](size_type n) const;

};

Цитата:

template <class T> class allocator {
public:
typedef T& reference;
typedef const T& const_reference;

...

};

Получается, что хотя бы для базовых типов и типов, не имеющих перегруженный оператор &, vector (с дефолтным аллокатором) должен располагать элементы в памяти последовательно.
Т.е., так и получается, что, к примеру, задавая свой аллокатор мы можем контролировать расположение элементов в памяти. Только вот смысла в этом не вижу.

8.2K
19 марта 2007 года
user1
71 / / 16.03.2007
еще вопрос:
где можно найти описание библиотеки windows.h ???
361
19 марта 2007 года
Odissey_
661 / / 19.09.2006
Цитата:
The elements of a
vector are stored contiguously, meaning that if v is a vector<T, Allocator> where T is some type
other than bool, then it obeys the identity &v[n] == &v[0] + n for all 0 <= n < v.size().



Все верно, только это строчка появляется в стандарте Second Edition (у меня First Edition, поэтому и не нашел), и только в 2003 году 23.2.4[1], technical corrigendum говорит - The elements of a vector are stored contiguously. Вообще дискуссия по поводу этой строчки здесь.

Так что версии STL до 2003 года я так понимаю, не гарантируют последовательного размещения.
Именно поэтому данное утверждение -

Цитата:
если пожертвовать переносимостью STL, вроде не все STL поддеживают последовательное размещение в памяти вектора, то

верно =).

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог