Как передать вектор в функцию c
Получается, вектор vect1, передается по значению в функцию func,
а как передать по ссылке?
Модератор: тег CODE
Последний раз редактировалось MaTBeu; 02.03.2009 в 20:20 .
Регистрация: 19.12.2008
Сообщений: 5,788
Пример:
по указателю
#include #include #include using namespace std; int func( vector*); int main() < vectorvect1; for(int i=0;i <10;i++) vect1.push_back(i); func(&vect1); getch(); return 0; >int func(vector* vect2) < int k; for(int i=0; iback(); vect2->pop_back(); cout >
#include #include #include using namespace std; int func( vector&); int main() < vectorvect1; for(int i=0;i <10;i++) vect1.push_back(i); func(vect1); getch(); return 0; >int func(vector& vect2) < int k; for(int i=0; i>
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.
___________________________________ ___________________________________ _______
[=Правила форума=] _____ [Поиск] _____ [Литература по С++] ____ [Литература. Паскаль]
Как передать в функцию указатель на std::Vector и разыменовать его?
Решаю задачу( условие в первой строке, -комментарий) и наткнулся на то,что не получается передать в функцию указатель на вектор и разыменовать его. Кто сталкивался с таким же — не пройдите мимо и не останьтесь равнодушны, а кто просто шарит — не останьтесь равнодушны. Спасибо !
//для двумерного массива вещественных чисел в куче определить вектор максимальных элементов по строкам. вектор разместить в куче #include #include"vector" #include #include #include #include using namespace std; void sort(int size_i, int size_j, double** arr, vector& pv) < //цикл нахождения максимального элемента для каждой строки for(int i = 0; i> //запись найденного элемента в конец вектора pv.push_back(max); > > int main() < srand(time(NULL)); int size_i, size_j; cout>size_i; cout>size_j; cout //цикл заполнения двумерного массива вещественными цислами for(int i = 0; i > //цикл вывода массива на экран for(int i = 0; i cout // vector* pv = new vector(); sort(size_i, size_j, arr, pv); coutsize(); i++) < cout<<*pv[i]for(int i = 0; i delete[] arr; return 0; >
- Вопрос задан более трёх лет назад
- 1731 просмотр
4 комментария
Средний 4 комментария
Как передать вектор в функцию c
Вот задался целью передать в функцию вектор структур, или хотябы указатель на него, чтобы производить над ним разлиные операции
#include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; struct input_struct < unsigned int ats; unsigned int num1; >; void end_of_str_inpfile(vector input_struct_of_file, int *string_counter) < input_struct_of_file.resize(*string_counter); >int main(int argc, char *argv[]) < int string_counter = 15; vectorinput_struct_of_file(10); end_of_str_inpfile(input_struct_of_file, &string_counter); cout
после всех наманипуляций (resize) в функции end_of_str_inpfile
размер вектора всеравно остается равен 10и
может я чего-то доконца не понимаю?
Последний раз редактировалось MaTBeu; 23.08.2009 в 05:47 .
| GroundZero |
| Посмотреть профиль |
| Найти ещё сообщения от GroundZero |
Как вернуть vector из функции: по значению или по ссылке?
Есть функция, создающая каким-то определенным образом экземпляр vector . Вопрос: как вернуть этот экземпляр вызывающему?
Правильное с точки зрения логики и стройности программы решение выглядит так:
std::vectorint> create_vector(const size_t N) std::vectorint> v; v.resize(N, 0xDEADC0DE); return v; >
Тут экземпляр вектора возвращается по значению, что означает потенциальное глубокое копирование локального объекта в контекст вызывающей функции. Сразу возникает сомнение: а что, если вектор огромен - его ж надо будет побайтно перекладывать из одного места в другое? Гораздо “разумнее” было бы написать:
void create_vector(const size_t N, std::vectorint>* v) v->resize(N, 0xDEADC0DE); >
Тут вектор передается по указателю, и стопроцентно ненужного полного копирования не будет. Но такой код выглядит откровенно плохо.
Сравним скорости работы на векторе длиной 100MB. Например, на компиляторе:
Apple clang version 3.1 (tags/Apple/clang-318.0.45) (based on LLVM 3.1svn) Target: x86_64-apple-darwin11.3.0
#include #include std::vectorint> __attribute__((noinline)) create_vector(const size_t N) std::cout <"by value" :: endl; std::vectorint> v; v.resize(N, 0xDEADC0DE); return v; > int main(int argc, char* argv[]) for (size_t i = 0; i 10; ++i) const size_t N = 1024 * 1024 * 100; std::vectorint> v = create_vector(N); if (v[i] != 0xDEADC0DE) std::cout <"Test is rubbish" :: endl; return 0; > > return 0; >
clang++ -O3 -o by_value by_value.cpp && time ./by_value
0m4.933s
Теперь по указателю:
#include #include void __attribute__((noinline)) create_vector(const size_t N, std::vectorint>* v) std::cout <"by pointer" :: endl; v->resize(N, 0xDEADC0DE); > int main(int argc, char* argv[]) for (size_t i = 0; i 10; ++i) const size_t N = 1024 * 1024 * 100; std::vectorint> v; create_vector(N, &v); if (v[i] != 0xDEADC0DE) std::cout <"Test is rubbish" :: endl; return 0; > > return 0; >
clang++ -O3 -o by_pointer by_pointer.cpp && time ./by_pointer
0m4.852s
Время в обоих случаях одинаково. Получается, что стоит выбрать первый, “красивый” вариант.
Объяснений тут два. Первый, и возможно самый важный - это RVO, Return value optimization. Это когда компилятор догадывается, что создаваемый локальный экземпляр вектора предназначен для возврата из функции, и сразу создает его в контексте вызывающего кода, чтобы потом не копировать туда. Фактически компилятор реализует передачу по ссылке, но неявно, не портя красоту исходного кода. Данный трюк будет работать для любого класса, не обязательно класса из STL.
Но оптимизация - это негарантированная вещь. Но тут есть еще одно подспорье. Стандартные контейнеры STL реализованы так, что при даже при глубоком копировании фактически копируется только небольшая управляющая структура, а сами данные, размещенные в куче, просто перебрасываются указателем, без их фактического перемещения. Тут, конечно, будет небольшое дополнительное копирование, но оно минимально, и возможно на него стоит пойти ради сохранения красивого кода.
Ну а в контексте C++11, где есть семантика перемещения, вообще не будет лишних копирований, если класс “правильно” реализован (что верно для классов из STL).
Мораль: используйте по возможности контейнеры из STL и оставьте оптимизацию компилятору. Иногда, конечно, компилятор ошибается, но таких случаев гораздо меньше, чем наоборот.