LINUX.ORG.RU

C++ array to vector


0

2

Есть такой код присвоения вектору массива:

string arr[] = {"0","1","2","3"};
vector<string> vec( arr, arr + sizeof(arr)/sizeof(arr[0]) );
Он отлично работает, но, пытаюсь написать функцию:
//Converting array to vector
vector <string> array_to_vector( string arr[]) {
vector <string> vec( arr, arr + sizeof(arr)/sizeof(arr[0]) );
return vec;
}
И вот тут, код отказывается работать верно. Возвращает вектор с двумя элементами, независимо от отданного ему массива в 10 элементов. Причем в возвращаемом векторе нулевой индекс только нормальный, первый же индекс вовсе пустой. Помогите разобраться, и нормально написать такую функцию.



Последнее исправление: makeB (всего исправлений: 1)

Внутри функции не узнать размер переданного массива. Передавай отдельным аргументом.

staseg ★★★★★
()

vector <string> array_to_vector( string arr[])

вот где-то с этого места и понимают что из С++ надо уходить либо к С & asm либо в динамическим языкам.

MKuznetsov ★★★★★
()
Ответ на: комментарий от Boy_from_Jungle

по идеи должно было сработать

Оно в рантайме должно специализацию написать?

Можно сделать обвёртку

template <typename T, std::size_t size>
class vector {

    std::vector<T> vec;

  public:

    // Update 2: и это тоже тогда не имеет смысла:
    // template <typename ...As>
    // vector(As ...as) : std::vector<T>(as...) {}

    // Тут какой-то интерфейс для векторов фиксированной длины.

};

но size уже не будет выводиться и с ним нужно не промахнуться при инициализации. Ну и от STL контейнеров наследовать тоже не очень, конечно - заменил на агрегацию, чтобы всякие push не сломали size.

quasimoto ★★★★
()
Последнее исправление: quasimoto (всего исправлений: 2)
Ответ на: комментарий от Boy_from_Jungle

это в компайл-тайме не сработает

Конечно, ибо vector класс динамический, его размер на этапе компиляции неопределён. Как подсказывает камрад quasimoto, можно наваять обвёртку, а лучше пользуйтесь std::array, он для этих целей и предназначен.

Dendy ★★★★★
()
Ответ на: комментарий от Dendy

а лучше пользуйтесь std::array, он для этих целей и предназначен

А в STL нет алгоритмов для разного рода resize копированием для array? Чтобы не писать

template<typename T, std::size_t size>
std::array<T, size + 1>
add_back(const std::array<T, size> &array, const T &el)
{
    std::array<T, size + 1> new_array;
    std::copy(array.begin(), array.end(), new_array.begin());
    new_array[size] = el;
    return new_array;
}

append и т.п. Ещё смущает, что тут два копирования - std::array не умеет move, с одним это будет

template<typename T, std::size_t size>
void add_back(std::array<T, size + 1> &new_array, const std::array<T, size> &array, const T &el)
{
    std::copy(array.begin(), array.end(), new_array.begin());
    new_array[size] = el;
}

что уже не удобно - всё равно нужно писать обвёртку или свой контейнер с array(array &&).

quasimoto ★★★★
()
Ответ на: комментарий от MKuznetsov

C++ тут не особо при делах, вне инициализации T[] == T* и в си, так что у ТС там деление размера указателя на размер string, а string у gcc это синоним для класса, который в области нестатичных данных выглядит так:

class str {

    struct Alc {
        char *data;
    };

    Alc alc;

};

то есть тоже размера указателя - отношение всегда будет равно 1, так что всё «правильно» :)

quasimoto ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.