вопросы по С++
Кто знает прошу: ответьте !
1. Как из контейнера vector переписать текущее значение в массив char ?????
2. Как из контейнера multimap переписать текущее значение в массив char ???
3. Какой оператор позволяет вводить в переменные типа string предложения с пробелами ??
вроде все.
а потом - посмотрим.
:) :o
1. Как из контейнера vector переписать текущее значение в массив char ?????
В цикле перебрать и скопировать.
2. Как из контейнера multimap переписать текущее значение в массив char ???
Аналогично, пример кода:
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 копируешь, что нужно куда нужно
}
3. Какой оператор позволяет вводить в переменные типа string предложения с пробелами ??
Например, семейство gets функций. копируешь в char array, и потом создаешь по ним строку. А можно считывать лексемы, пока не кончится поток cin, и их конкатенировать к какой-то строке.
Надежный вариант. Железный.
Но, если пожертвовать переносимостью STL, вроде не все STL поддеживают последовательное размещение в памяти вектора, то можно к примеру так -
#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;
}
Но, если пожертвовать переносимостью STL, вроде не все STL поддеживают последовательное размещение в памяти вектора, то можно к примеру так -
А разве не всегда элементы последовательно расположены?
Вообще в стандарте нашел только упоминание о времени доступа к элементам вектора, о константном для втавки и удалении в конец вектора и линейном о вставки, удалении в середину вектора.
Вот что пишет о этом Страуструп
Так что гарантия последовательного размещения в памяти самим стандартом не определена. Ну и как верно заметил efferson, это не всегда возможно.
Не списка только - как раз вектор то эмулирует не список, а именно вектор или массив если хотите. Это разные при исспользовании вещи.
Так что гарантия последовательного размещения в памяти самим стандартом не определена.
[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 (с дефолтным аллокатором) должен располагать элементы в памяти последовательно.
Т.е., так и получается, что, к примеру, задавая свой аллокатор мы можем контролировать расположение элементов в памяти. Только вот смысла в этом не вижу.
где можно найти описание библиотеки windows.h ???
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 года я так понимаю, не гарантируют последовательного размещения.
Именно поэтому данное утверждение -
верно =).