Вопрос по c++, locking, vector, const, size – @DanS: в этом случае std :: array может быть не для вас. Смотрите мне обновить ответ (через несколько секунд).

6

ли способ зафиксировать размер вектора и при этом изменить содержимое?

Я попытался сделать константный векторconst std::vector<int> vec(10); но это мешает мне изменить ценности.

vec[3] = 3; выдает ошибку компилятора: назначение места только для чтения.

Я также пытался с константной ссылкой на неконстантный вектор

std::vector<int> vec(10);
const std::vector<int>& vecref(vec);

что дает ту же ошибку компилятора.

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

Я использую g ++, если это имеет значение.

Какие «векторные алгоритмы» вы хотите использовать? Что-нибудь в<algorithm> это работает с std :: vector фиксированного размера, будет работать с простым массивом, потому что алгоритмы работают с итераторами, а не с контейнерами. Steve Jessop
я используюfind_if, for_each и несколько других. Я не понимал, что могу использовать их с простыми массивами. DanS
Если вы найдете здесь хороший ответ, вы должны принять его :) Sebastian Mach

Ваш Ответ

4   ответа
1

boost.array, он дает вам массив фиксированного размера с векторной семантикой (за исключением всего, что может изменить размер массива).

Ну, честно говоря, push_back не может быть поддержанЛюбые Ответ на вопрос автора, так как он по определению меняет размер массива. jcoder
@phresnel: да, конечно. Отредактированный, чтобы усилить фиксированный размер природы массивов. Ferruccio
«векторная семантика» вводит в заблуждение и ошибочна. push_back, pop_back, resize и другие не поддерживаются boost.array. Sebastian Mach
На самом деле, одним из случаев, в которые я не вошел, было увеличение вектора при чтении файлов конфигурации, а затем фиксированный размер. DanS
@DanS: в этом случае std :: array может быть не для вас. Смотрите мне обновить ответ (через несколько секунд). Sebastian Mach
1

константный вектор указателейи измените объекты, на которые они указывают. Не сказать, что это правильный ответ, просто это возможно.

3

который предоставляет только те операции, которые вы хотите разрешить.

Ура & hth.,

6

>, который похож на старый добрый массив, с дополнительным преимуществом в качестве контейнера STL, что позволяет использовать много std :: алгоритмов.

В качестве альтернативы, вы можете попробовать boost :: array.

повышение :: массивстанд :: массив

Обратите внимание, что есть такжеstd::tr1::array<>.

редактировать:

На самом деле, одним из случаев, в которые я не вошел, было увеличение вектора при чтении файлов конфигурации, а затем фиксированный размер - DanS

Тогда почему бы не это (иллюстрация):

#include <vector>

int main () {
    std::vector<int> foo;

    /* ... crunch upon foo ... */

    // make a copy vector->vector:
    const std::vector<int> bar (foo); 

    // make a copy any->vector
    const std::vector<int> frob (foo.begin(), foo.end());
}

В качестве альтернативы, если вам нужна семантика reset (), но вы хотите запретить resize () и др., Вы можете написать адаптер контейнера:

template <typename T, typename Allocator = allocator<T> >
class resettable_array {
public:
    // container ...
    typedef typename std::vector<T,Allocator>::iterator iterator;
    typedef typename std::vector<T,Allocator>::const_iterator const_iterator;
    ...

    iterator begin() { return vector_.begin() }
    const_iterator begin() const { return vector_.begin(); }
    ...

    void push_back (T const &v) { vector_.push_back (v); }
    ...

    // custom
    void reset () { ... }

private:
    std::vector<T,Allocator> vector_;
};

Смотрите также:

std :: vector constructors
Еще одним преимуществом C ++ 11 являетсяstd::begin а такжеstd::endтакже работает со старыми добрыми стандартными массивами фиксированного размера, такими какint[5]следовательно, также позволяет использоватьstd::algorithm а такжеstd::numeric среди прочих доброты. Jean-Michaël Celerier

Похожие вопросы