Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,838
Записей в блоге: 4

Можно ли присвоить вектор одного типа вектору дргого типа?

12.11.2022, 18:08. Показов 2181. Ответов 35
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть 2 объекта
C++
1
2
vector<int>ector(17);
vector<char>lector;
Присвоить объекту lector объект ector. Если объекты одного типа то вроде работает, не знаю правда опасно ли это. И можно ли присвоить другой адрес, имеется в виду с простого указателя и далее смотреть уже массив как вектор?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.11.2022, 18:08
Ответы с готовыми решениями:

Как присвоить значение одного из элементов массива типа char переменной типа int?
С++ начал буквально только что так что буду благодарен за терпение и понимание ) Сразу оговорюсь что уже искал ответ но на эту тему...

Можно ли присвоить объекту основного типа значение объекта пользовательского типа?
Правильно ли я понимаю, что SomeClass obj; int x = obj; или SomeClass obj; int x = 5 + obj;

Попытка присвоить переменной типа integer выражение типа real
Здравствуйте форумчане. Написала программу для замены элементов массива после максимального элемента на 0. Нужно исправить код,...

35
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
13.11.2022, 17:57
Студворк — интернет-сервис помощи студентам
Nexi99, чтобы не переписывать, нужно делать как я показал. Потому что этот код может сломаться не только из-за смены разрядности, но и из-за смены ключей оптимизации.
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,838
Записей в блоге: 4
13.11.2022, 18:06  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
чтобы не переписывать, нужно делать как я показал. Потому что этот код может сломаться не только из-за смены разрядности, но и из-за смены ключей оптимизации.
тут конечно вы правы. Но использование этой штуки va_arg не всегда удобно бывают ситуации очень сложные.

Добавлено через 1 минуту
Цитата Сообщение от DrOffset Посмотреть сообщение
Нет. Если вам нужно это, то сохранение информации о типе, переданном в ... нужно делать самостоятельно.
размер определяется константой в угловых скобочках(int). Это строго типизированный оъект, имеется в виду вектор.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
13.11.2022, 18:15
Цитата Сообщение от Nexi99 Посмотреть сообщение
Это строго типизированный оъект
Вся типизация на этапе компиляции. Эллипсис (...) типизацию не сохраняет, он для этого и придуман. Функции, наподобие printf, которые используют эллипсис, передают типизацию в первом параметре (формат строка в случае printf) и анализируют ее уже на этапе исполнения.
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,838
Записей в блоге: 4
13.11.2022, 18:20  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
передают типизацию в первом параметре
да там просто стэк. Всё что меньше 5ти байт занимает 4 байта, float и всё остальное 8 байт, тодько нужно правильно считать не ошибиться адресом. Это правило актуально для 32 битных разрядностей. Ещё тип не нужно ставить(это зависит от заадчи), можно вариативную функцию с типом делать где не ставиться запятая а сразу пишется так
C++
1
int Pint(int a...)
, в этом случае всё int.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
13.11.2022, 18:51
Цитата Сообщение от Nexi99 Посмотреть сообщение
Всё что меньше 5ти байт занимает 4 байта, float и всё остальное 8 байт, тодько нужно правильно считать не ошибиться адресом. Это правило актуально для 32 битных разрядностей
Во-первых путаете типизацию и хранение в памяти.
Во-вторых описание того, как конвертируются типы при передаче в эллипсис, написано в документации, не надо ничего сочинять: https://en.cppreference.com/w/... onversions

Цитата Сообщение от Nexi99 Посмотреть сообщение
float и всё остальное 8 байт
Вот типизация вам и нужна, чтобы отличить float double от всего остального. По одному размеру памяти вы не сможете это сделать. Хранение в этих 8 байтах целого числа, числа с плавающей точкой или какой-нибудь структуры отличается, а способ интерпретации этих байт зависит от типизации, которая теряется при передаче в эллипсис.
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,838
Записей в блоге: 4
13.11.2022, 19:05  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Вот типизация вам и нужна, чтобы отличить float double от всего остального.
Я это изучал это на практике и знаю что пишу. Добре в общем вопрос решён. Нужно со списком что-то мутить(я имею в виду метопрограмму), я взялся за изучение того кода довольно активно.
0
 Аватар для Наталья8
622 / 380 / 67
Регистрация: 09.03.2016
Сообщений: 4,156
13.11.2022, 21:21
Я пытаюсь это всё понять. Доходит плохо.
А можно поинтересоваться,
А какая польза от всей этой хрени.?
(Ни разу не встречал её ни где)

Добавлено через 2 минуты
Зачем работать одновременно с разными типами?

Добавлено через 1 минуту
Тем более переносимость всего этого, ни очень хорошая.
1
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
13.11.2022, 21:23
Цитата Сообщение от Наталья8 Посмотреть сообщение
Зачем работать одновременно с разными типами?
Зачем вообще работать ?
Есть много моментов когда это удобно. Иногда необходимо.

Наталья8, это мысли утопистов, как Nexi99, которые считают что все просто.
И не зная некоторых (хотя думается многих) основ, пытаются впихнуть невпихуемое, и смешать мокрое с круглым.
Так что не обращай внимания.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
13.11.2022, 22:52
Цитата Сообщение от Nexi99 Посмотреть сообщение
тут конечно вы правы. Но использование этой штуки va_arg не всегда удобно бывают ситуации очень сложные.
Nexi99, глядя в тему я не пойму задачу. Если вам нужно вывести в поток то потоки умеют выводить всё, кроме того что они не умеют. POD легко выводят. std::string тоже. Если всё же вам нужно то, что вы вывели в заголовке:
Цитата Сообщение от Nexi99 Посмотреть сообщение
Можно ли присвоить вектор одного типа вектору дргого типа?
То у Герба Саттера в Решение сложных задачи на С++, где то в разделе типа Повторное использование кода в контейнерах (или шаблонах), - не помню точно, есть шаблонные конструкторы в которых вектор получается из вектора с другим типом элемента. Таким же образом можно и присваивание организовать. То есть, будет компилироваться и работать, если вы пытаетесь присвоить вектор вектору, где есть автоматическое преобразование элемента присваимого к элементу в который вы собрались присвоить. В предельном случае, на свой страх и риск вы можете перегрузить оператор для присваивания с принудительным преобразованием, но я бы этого не стал делать.
То есть, в стандартной библиотеке такого нет, но если оно кому-то надо в черновом варианте как-то так оно может быть:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <vector>
 
template<class A, class B>
std::vector<A> operator+(const std::vector<A>& a, const std::vector<B>& b)
{
    constexpr auto szA=sizeof(A) ;
    constexpr auto szB=sizeof(B) ;
        static_assert( szA >= szB, "sizeof A < sizeof B");
 
            auto allowed_shift=std::min(szA,szB);
 
            std::vector<A> result(allowed_shift);
            auto itA=a.cbegin();
            auto itB=b.cbegin();
            auto itRes=result.begin();
            auto itAend=itA+allowed_shift;
 
    for( ; itA<itAend; ++itA, ++itB, ++itRes)
    {
        *itRes=*itA+*itB;
    }
 
    return result;
}
 
int main()
{
    std::vector<int> vi{1,2,3,4} ;
    std::vector<float>vf{2,3.5,4,5.,6};
    std::vector<float> vec_fl_summ=vf+vi;
     for(auto el: vec_fl_summ)
        std::cout<<el<<' ';
     return 0;
Добавлено через 27 минут
Н-нет... Именно присваивание должно быть не статической функцией-членом. То есть, можно как я показал, но складывать с нулевым вектором длинны оригинала и типа результата. Результат будет феерическим.
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,537
Записей в блоге: 1
13.11.2022, 22:55
Цитата Сообщение от SmallEvil Посмотреть сообщение
Есть много моментов когда это удобно. Иногда необходимо.
проблема в том, что на С++ пытаются писать что угодно и в какой угодно парадигме программирования.
Хранить переменные нетипизированно с мета-информацией о типе? На С++ конечно же!
Писать кодогенерацию в рантайме? С++ отличный язык для задачи!
Называть массивом хранилище различных по размеру элементов данных? В С++!
Не нужны нам интерпретируемые языки, которым свойственны такие фокусы в рантайме...
Мы на С++ напишем свой интерпретатор
В С++ уже запрятан где-то встроенный интерпретатор, мы просто сейчас назадаём вопросов и выясним, где его спрятали!
1
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
14.11.2022, 00:03
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
проблема в том, что на С++ пытаются писать что угодно
Это не проблема.
Проблема только у тех, кто не в состоянии это сделать
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
14.11.2022, 00:16
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
В С++ уже запрятан где-то встроенный интерпретатор, мы просто сейчас назадаём вопросов и выясним, где его спрятали!
Истинно говорю вам, комитетчики тайно занимаются масоно-ложеством.
Nexi99, возможно, меньшим из зол могло бы быть написание своей шаблонной функции типа
C++
1
2
template<class T, class U>
vector<T>& assign(vector<T>& to_return, const vector<U>& to_assign);
А при создании можно использовать конструктор, принимающий пару итераторов вектора другого типа:
C++
1
2
3
4
 std::vector<int> vi{1,2,3,4} ;
        std::vector<float>vf(vi.begin(), vi.end());
         for(auto el: vf)
        std::cout<<el<<' ';
2
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
14.11.2022, 12:49
Вот более менее чистый кот. Оператор позволяет a=b=c; но в данных уловиях это безумие. А значит неоператорная функция, это то что нужно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
template<class T, class U>
std::vector<T>& assign_vector_other_type(std::vector<T>& target, std::vector<U> const& source )
{
   std::vector<T> TMP(source.begin(), source.end()) ;//own ctor
   using std::swap ;
   swap(target, TMP);//moving from prvalue
   return target;
}
 
int main()
{
    std::vector<int> vi{1,2,3,4} ;
    std::vector<float>vf{2,3.5,4,5.,6};
 
    vf=assign_vector_other_type(vf, vi);
 
     for(auto el: vf)
        std::cout<<el<<' ';
 
    return 0;
хотя в случаях, где реалок вектора - цели гарантированно не происходит (равные размеры) лучше просто пройти и скопировать почленно. Иначе, - что создавать новый объект, что реалок, - один хендлер).
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,838
Записей в блоге: 4
11.12.2022, 20:18  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Нет. Если вам нужно это, то сохранение информации о типе, переданном в ... нужно делать самостоятельно.
Вот здесь https://cplusplus.com/referenc... or/vector/ написано что
Тип элемента value_type — это тип элементов в контейнере, определенный в векторе как псевдоним его первого параметра шаблона ( T ). Не совсем понятно что это значит, упоминается про некое 1ое состояние но не понятно как добраться до этой переменной. Функция get_allocator() всегда возвращает текущее состояние. Я так понимаю что от большего адреса вычитаем самый 1ый адрес далее делим на тип и получается размер. Это значит если тип вектора измениться то и размер пересчитывается также. Непонятно хранит ли оно где-то тип или нет.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
11.12.2022, 20:54
Nexi99, тип - это информация времени компиляции. value_type и сам T - это информация времени компиляции. Специально она нигде не хранится, я вам уже об этом говорил (но вы правда нифига не слушаете, поэтому я предпочитаю вам не отвечать). Количество элементов в векторе получается функцией size(), количество памяти (в элементах), выделенной вектором, - функцией capacity(). Если нужно узнать общее количество выделенных байт, надо capacity() умножить на sizeof(T).
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,838
Записей в блоге: 4
14.12.2022, 20:04  [ТС]
Вот здесь есть пример https://cplusplus.com/referenc... allocator/.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <vector>
 
int main ()
{
  std::vector<int> myvector;
  int * p;
  unsigned int i;
 
  // allocate an array with space for 5 elements using vector's allocator:
  p = myvector.get_allocator().allocate(5);
 
  // construct values in-place on the array:
  for (i=0; i<5; i++) myvector.get_allocator().construct(&p[i],i);
 
  std::cout << "The allocated array contains:";
  for (i=0; i<5; i++) std::cout << ' ' << p[i];
  std::cout << '\n';
 
  // destroy and deallocate:
  for (i=0; i<5; i++) myvector.get_allocator().destroy(&p[i]);
  myvector.get_allocator().deallocate(p,5);
 
  return 0;
}
Возникает вопрос а если память в вектор уже выделена то что в этом случае, если сделать как показано здесь то там память перевыделяется заново, перенаправления не происходит. И если в векторе до вызова get_allocator были значения в ячейке то они теряются.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.12.2022, 20:04
Помогаю со студенческими работами здесь

Ошибка: присвоить переменной типа real выражение типа boolean
program graf; var x, y: real; begin writeln('Input x= '); readln(x); begin if (x &gt; -4) and (x &lt; -2) then ...

Попытка присвоить переменной типа integer выражение типа real
Здравствуйте! Моя задача: Найти сумму всех n-значных чисел, кратных k (1 ≤ п ≤ 4). Я составила программу, но выдает ошибку &quot;Попытка...

Запись информации из вектора типа string в вектор типа double
Как записать только числа , которые хранятся в векторе типа стринг, в вектор типа дабл, в векторе типа стринг есть как буквы так и числа ,...

Можно ли переменной типа String присвоить кодировку (чат vk)
Подскажите можно ли переменной типа String присвоить кодировку? Проблема в том,что пишу оффлайн чат вконтакте и текст из ТекстБокса не...

Дан массив типа Object. Состоящий из 15 элементов, 5 из них типа Integer, 5 типа String и 5 типа Double
Разделить массив типа Object на 3 массива по типам данных. Числовые массивы отсортировать в порядке убывания. ...


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

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Новые блоги и статьи
[golang] Двоичная куча, min-heap
alhaos 20.05.2026
Двоичная куча Двоичная куча — структура данных, которая всегда держит самый важный элемент наготове. Представьте очередь к хилеру в игре, и очередь из игроков в приоритете те у кого меньше. . .
[golang] Breadth-First Search
alhaos 19.05.2026
BFS (Breadth-First Search) — это базовый алгоритм обхода графа в ширину, который поуровнево исследует все связанные вершины. Он начинает с выбранной точки и проверяет всех соседей, прежде чем. . .
[golang] Алгоритм «Хак Госпера»
alhaos 17.05.2026
Алгоритм «Хак Госпера» Хак Госпера (Gosper's Hack) — алгоритм нахождения следующего по величине числа с тем же количеством установленных бит. Придуман Биллом Госпером в 1970-х, опубликован в. . .
Рисование бинарного древа до 6-го колена на js, svg.
russiannick 17.05.2026
<svg width="335" height="240" viewBox="0 0 335 240" fill="#e5e1bb"> <style> <!]> </ style> <g id="bush"> </ g> </ svg> function fn(){ let rost;/ / высота древа let xx=165,yy=210,w=256;
FSharp: interface of module
DevAlt 16.05.2026
Интерфейс модуля F# позволяет управлять доступностью членов, содержащихся в реализации модуля. По-умолчанию все члены модуля доступны: module Foo let x = 10 let boo () = printfn "boo" . . .
Хитросплетение родственных связей пантеона греческих богов.
russiannick 14.05.2026
Однооконник, позволяющий узреть и изучить отдельных героев древней Греции. <!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible". . .
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов. import "math" func angleClock(hour int, minutes int) float64 { . . .
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru