Форум программистов, компьютерный форум CyberForum.ru

Реально ли получить из стд::вектора Сишный массив? - C++

Восстановить пароль Регистрация
 
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
15.03.2013, 23:17     Реально ли получить из стд::вектора Сишный массив? #1
Или для этого придётся поэлементно копировать и смысл теряется? Я понимаю, что указатель на память выделяемую вектором спрятан где-то глубоко в его реализации. И вообще в том, что он спрятан - вся суть класса.
Но если мне надо передать данные в функцию, принимающую Си-массив, неужели я либо не смогу использовать вектор, либо буду предварительно создавать си-массив и копировать в него поэлементно вектор(тогда какой смысл вообще STL использовать, ща возьму да и напишу свой вектор с методом T* get_ArrayOf_data() )?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
15.03.2013, 23:39     Реально ли получить из стд::вектора Сишный массив? #2
Kuzia domovenok, любой вектор допускает индексацию [] тобишь
C++
1
2
vector <int> vec;
int a = vec[5];
вполне корректно и даже так и задумывалось, зачем тебе data?
-=ЮрА=-
Заблокирован
Автор FAQ
15.03.2013, 23:47     Реально ли получить из стд::вектора Сишный массив? #3
Ну а так вот код чтобы погрызть
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <vector>
#include <iostream>
using namespace std;
 
int main()
{
    int i;
    int * arr = 0;
    vector <int> vec;
    for(i = 0; i < 15; i++)
        vec.push_back(i + 1);
    cout<<"\nVector : ";
    for(i = 0; i < vec.size(); i++)
        cout<<vec[i]<<" ";
    cout<<"\nData Arr : ";
    arr = vec.begin();
    for(i = 0; i < vec.size(); i++)
        cout<<arr[i]<<" ";
    cout<<"\nEnd of algorithm"<<endl;
    cin.get();
    return 0;
}
алгоритм на рассово верных плюсах по ссылке http://codepad.org/NbNN4Ks6
Output:
Vector : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Data Arr : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
End of algorithm
Миниатюры
Реально ли получить из стд::вектора Сишный массив?  
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
15.03.2013, 23:51     Реально ли получить из стд::вектора Сишный массив? #4
Одно дело индексация, а другое дело — внешняя функция, которой по барабану все ваши векторы и подавай указатель на сишный массив.

По теме: да, надо или копировать (если функция дана априори и её нельзя менять), или учить функцию работать с векторами (или хоть итераторами). Смысл использования STL надо было обдумывать вместе с обдумыванием решения об использовании такой функции.
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
15.03.2013, 23:55     Реально ли получить из стд::вектора Сишный массив? #5
Kuzia domovenok, для C++98 единственный способ, это получение адреса первого элемента
C++
1
2
3
4
void func(int* p);
//...
std::vector<int> v;
func(&v[0]);
в текущем стандарте(С++11), у вектора есть метод data
C++
1
2
3
4
void func(int* p);
//...
std::vector<int> v;
func(v.data());
-=ЮрА=-
Заблокирован
Автор FAQ
16.03.2013, 00:01     Реально ли получить из стд::вектора Сишный массив? #6
Цитата Сообщение от rangerx Посмотреть сообщение
для C++98 единственный способ, это получение адреса первого элемента
Цитата Сообщение от rangerx Посмотреть сообщение
в текущем стандарте(С++11), у вектора есть метод data
- данный метод есть у std::string(который также является контейнером пусть и char-ов как и вектор).
Потом видимо разработчики STL услышали мольбы программистов и ввели этот метод и для vector-а
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.03.2013, 00:46     Реально ли получить из стд::вектора Сишный массив?
Еще ссылки по теме:

Можно ли для стд::вектор'а взять адрес и-го элемента? C++
C++ Как получить поля вектора структур?
Массив, элементы которого - вектора C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.03.2013, 00:46     Реально ли получить из стд::вектора Сишный массив? #7
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Или для этого придётся поэлементно копировать и смысл теряется? Я понимаю, что указатель на память выделяемую вектором спрятан где-то глубоко в его реализации. И вообще в том, что он спрятан - вся суть класса.
Но если мне надо передать данные в функцию, принимающую Си-массив, неужели я либо не смогу использовать вектор, либо буду предварительно создавать си-массив и копировать в него поэлементно вектор(тогда какой смысл вообще STL использовать, ща возьму да и напишу свой вектор с методом T* get_ArrayOf_data() )?
Скотт Мейерс - "Эффективное Использование STL"
Совет 16. Научитесь передавать данные vector и string функциям унаследованного интерфейса.
Yandex
Объявления
16.03.2013, 00:46     Реально ли получить из стд::вектора Сишный массив?
Ответ Создать тему
Опции темы

Текущее время: 14:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru