Запрос о конструкторе диапазона вектора - PullRequest
0 голосов
/ 21 марта 2020
char mychars[] = { 'A','B','C','D' };
vector<int> a(mychars, mychars + 4);
cout << a[0] << " " << a[1] << " " << a[2] << " " << a[3];

почему выводится 65 66 67 68? я создал вектор типа int, поэтому он должен был хранить A, B, C, D в одном целом из 4 байтов, но он сохраняет их индивидуально, создавая 4 целых числа почему.

Ответы [ 2 ]

1 голос
/ 21 марта 2020

Нет. вектор не знает внутреннего представления содержимого объекта. Когда вы создаете вектор с использованием конструктора диапазона , он создает контейнер только с таким количеством элементов, как range [first, last), причем каждый элемент конструируется emplace из своего соответствующего элемента в массиве myChars, в тот же заказ.

0 голосов
/ 21 марта 2020

Когда вы передаете массив символов в конструктор, конструктор предполагает, что массив содержит символы и, следовательно, проходит через массив, преобразует каждый символ в целое число и создает вектор из целых чисел.

I думаю, вы могли бы немного «взломать» указатели, чтобы достичь желаемого результата. Вместо того, чтобы передавать указатель на char в векторный конструктор, вы можете привести mychars к целочисленному указателю, чтобы c ++ рассматривал 4 байта, используемых массивом mychars, как одно целое число. Однако вы должны быть осторожны с размером предполагаемого целочисленного массива, который используется в качестве смещения для конструктора. В вашем случае смещение составляет 1 вместо 4, потому что на каждые 4 символа у вас есть 1 целое число. Однако я заменил его на более общий sizeof(mychars)/sizeof(int)), чтобы учесть массивы с более чем 4 элементами (элементы mychar должны быть кратны 4).

#include <iostream>
#include <vector>

using namespace std;

/*
 Id is between 0 and 3 (inclusive)
*/
char char_from_int(int number, int id) {
    return (number >> (8*id)) & 0xff;
}

int main()
{
    char mychars[] = { 'A','B','C','D','e','f','g','h' };
    vector<int> a((int*)mychars, (int*)mychars +sizeof(mychars)/sizeof(int));

    for(int i=0;i<a.size();i++) {
        cout<<char_from_int(a[i],0)<<char_from_int(a[i],1)<<char_from_int(a[i],2)<<char_from_int(a[i],3)<<endl;
    }




    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...