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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Kuzia domovenok
1892 / 1747 / 119
Регистрация: 25.03.2012
Сообщений: 5,936
Записей в блоге: 1
#1

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

15.03.2013, 23:17. Просмотров 553. Ответов 10
Метки нет (Все метки)

Или для этого придётся поэлементно копировать и смысл теряется? Я понимаю, что указатель на память выделяемую вектором спрятан где-то глубоко в его реализации. И вообще в том, что он спрятан - вся суть класса.
Но если мне надо передать данные в функцию, принимающую Си-массив, неужели я либо не смогу использовать вектор, либо буду предварительно создавать си-массив и копировать в него поэлементно вектор(тогда какой смысл вообще STL использовать, ща возьму да и напишу свой вектор с методом T* get_ArrayOf_data() )?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.03.2013, 23:17
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Реально ли получить из стд::вектора Сишный массив? (C++):

Можно ли для стд::вектор'а взять адрес и-го элемента? - C++
Допустим, есть код на Си: int a; __builtin_prefetch (&a); /* тут идёт обработка первых 1000 элементов массива */ ...

Получить размер вектора - C++
Привет всем. Столкнулся вот с такой проблемкой: Есть вектор: std :: vector<Ball*> balls; Он находится инициализируется в классе...

Получить в вектора, float - C++
Здравствуйте. Есть: Vector vecAngle; Как получить float *flAngle с него?

Массив: Получить из исходного вектора новый, элементы которого вычисляются по формуле S(i)= i*(-i - 4)*sin(i) - Turbo Pascal
Дан вектор S размера n, где n<=15. Элементы вектора вычисляются по формуле S(i)= i*(-i - 4)*sin(i). Значения элементов округлять до одного...

Массив: Вычесть из каждого элемента действительного вектора C(c1,c2,..,c9) среднее арифметическое вектора. - C#
Помогите решить, не знаю с чего начать: 1. Вычесть из каждого элемента действительного вектора C(c1,c2,..,c9) среднее арифметическое ...

Перенаправление стд вывода - Visual Basic
Здравия желаю!!! Знающие С++ и прочие умельцы откликлитесь (click :))Вобщем нужно перенаправить выход ДОС команды на тотже текстбокс или...

10
-=ЮрА=-
Заблокирован
Автор FAQ
15.03.2013, 23:39 #2
Kuzia domovenok, любой вектор допускает индексацию [] тобишь
C++
1
2
vector <int> vec;
int a = vec[5];
вполне корректно и даже так и задумывалось, зачем тебе data?
0
-=ЮрА=-
Заблокирован
Автор 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
0
Миниатюры
Реально ли получить из стд::вектора Сишный массив?  
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
15.03.2013, 23:51 #4
Одно дело индексация, а другое дело — внешняя функция, которой по барабану все ваши векторы и подавай указатель на сишный массив.

По теме: да, надо или копировать (если функция дана априори и её нельзя менять), или учить функцию работать с векторами (или хоть итераторами). Смысл использования STL надо было обдумывать вместе с обдумыванием решения об использовании такой функции.
0
rangerx
1935 / 1544 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
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());
2
-=ЮрА=-
Заблокирован
Автор FAQ
16.03.2013, 00:01 #6
Цитата Сообщение от rangerx Посмотреть сообщение
для C++98 единственный способ, это получение адреса первого элемента
Цитата Сообщение от rangerx Посмотреть сообщение
в текущем стандарте(С++11), у вектора есть метод data
- данный метод есть у std::string(который также является контейнером пусть и char-ов как и вектор).
Потом видимо разработчики STL услышали мольбы программистов и ввели этот метод и для vector-а
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.03.2013, 00:46 #7
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Или для этого придётся поэлементно копировать и смысл теряется? Я понимаю, что указатель на память выделяемую вектором спрятан где-то глубоко в его реализации. И вообще в том, что он спрятан - вся суть класса.
Но если мне надо передать данные в функцию, принимающую Си-массив, неужели я либо не смогу использовать вектор, либо буду предварительно создавать си-массив и копировать в него поэлементно вектор(тогда какой смысл вообще STL использовать, ща возьму да и напишу свой вектор с методом T* get_ArrayOf_data() )?
Скотт Мейерс - "Эффективное Использование STL"
Совет 16. Научитесь передавать данные vector и string функциям унаследованного интерфейса.
0
FVF
0 / 0 / 0
Регистрация: 03.07.2015
Сообщений: 15
10.02.2017, 08:52 #8
Нужно наверное вот так:
C++
1
2
3
int * arr = 0;
vector <int> vec;
arr = &(*vec.begin());
0
GbaLog-
Любитель чаепитий
3011 / 1379 / 334
Регистрация: 24.08.2014
Сообщений: 4,896
Записей в блоге: 1
Завершенные тесты: 2
10.02.2017, 10:13 #9
Цитата Сообщение от FVF Посмотреть сообщение
Нужно наверное вот так
Не, всё намного проще, начиная с с++11.
C++
1
2
3
int * ptr = nullptr;
std::vector<int> vec;
ptr = vec.data();
0
Croessmah
Эксперт CЭксперт С++
13510 / 7668 / 866
Регистрация: 27.09.2012
Сообщений: 18,866
Записей в блоге: 3
Завершенные тесты: 1
10.02.2017, 11:39 #10
GbaLog-, об этом уже не один год назад написано в этой теме.
0
GbaLog-
Любитель чаепитий
3011 / 1379 / 334
Регистрация: 24.08.2014
Сообщений: 4,896
Записей в блоге: 1
Завершенные тесты: 2
10.02.2017, 12:47 #11
Цитата Сообщение от Croessmah Посмотреть сообщение
об этом уже не один год назад написано в этой теме.
Да я не парюсь особо, просто нажимаю кнопочку "Перейти к новому", не смотря на старые ответы, чтобы не появилось желание на них ответить и выставить себя дураком.
0
10.02.2017, 12:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.02.2017, 12:47
Привет! Вот еще темы с ответами:

Построчное выполнение asm-вставки в сишный код - Assembler
Подскажите, возможно ли во время дебаггинга выполнять ассемблерную вставку построчно? обычно весь asm-блок проскакивает сразу целиком, а...

Реально ли создать массив матриц? - Matlab
Есть например какой-то набор матриц A1, A2... An. Надо его загнать в массив то есть сделать

Выделить программно массив ячеек в datagridview реально? - C#
Выделить программно массив ячеек в datagridview реально, или хотя бы диапазон ячеек? SelectedСells имеет только метод get.

Найти выражение для: вектора скорости; вектора ускорения; модуля радиус-вектора - Механика
Товарищи, помогите пожалуйста решить. Радиус-вектор материальной точки задается выражением: r=(t^2+2)i+(3t^2+4)j Найти...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru