Вопрос о хранении массива в станд.:: вектор в C++

Я думаю, что ядро Linux является хорошей ссылкой для этого:

номер версии ядра Linux в настоящее время состоит из четырех чисел, после недавнего изменения в давней политике схемы управления версиями с тремя числами. Для иллюстрации позвольте ему быть принятым, что номер версии составлен таким образом: A.B.C.D[] (например, 2.2.1, 2.4.13 или 2.6.12.3).

* The A number denotes the kernel version. It is rarely changed, and

только, когда существенные изменения в коде и понятии ядра происходят. Это было изменено дважды в истории ядра: В 1994 (версия 1.0) и в 1996 (версия 2.0).

* The B number denotes the major revision of the kernel.
      o Prior to the Linux 2.6.x series, even numbers indicate a stable

выпуск, т.е. тот, который считают подходящим для производственного использования, такой как 1,2, 2.4 или 2.6. Нечетные числа исторически были выпусками разработки, такой как 1,1 или 2.5. Они были для тестирования новых возможностей и драйверов, пока они не стали достаточно стабильными, чтобы быть включенными в стабильную версию. Это была ровная/нечетная схема номера версии. o Запускающийся с серии Linux 2.6.x, нет никакого значения для четных или нечетных чисел с разработкой новой возможности, продолжающейся в том же ряду ядра. Linus Torvalds заявил, что это будет моделью для обозримого будущего.

* The C number indicates the minor revision of the kernel. In the old

схема управления версиями с тремя числами, это было изменено, когда патчи безопасности, исправления ошибок, новые возможности или драйверы были реализованы в ядре. С новой политикой, однако, это только изменяется, когда новые драйверы или функции представлены; незначительные меры обрабатываются числом D.

* A D number first occurred when a grave error, which required immediate

фиксация, был встречен в 2.6.8's код NFS. Однако было недостаточно других изменений для узаконивания выпуска нового незначительного пересмотра (который будет 2.6.9). Так, 2.6.8.1 был выпущен, с единственным изменением, являющимся фиксацией той ошибки. С 2.6.11, это было принято как новая официальная политика управления версиями. Исправлениями ошибок и патчами безопасности теперь управляет четвертое число, тогда как большие изменения только реализованы в незначительных изменениях пересмотра (число C). Число D также связано с количеством раз, что компилятор создал ядро, и таким образом назван "номером сборки".

кроме того, иногда после того, как версия там будет еще некоторыми буквами, такими как 'rc1' или 'mm2'. 'Дистанционное управление' относится к предвыпускной версии и указывает на неофициальный выпуск. Другие буквы обычно являются (но не всегда) инициалами человека. Это указывает на ответвление разработки ядра тем человеком. например, ck поддерживает Con Kolivas, ac поддерживает Alan Cox, тогда как мм, выдержанное за Andrew Morton. Иногда, буквы связаны с основной областью разработки ответвления, ядро создается из, например, wl указывает на тестовую сборку беспроводных сетей.

От http://en.wikipedia.org/wiki/Linux_kernel#Version_numbering

6
задан Evan Teran 23 September 2009 в 19:45
поделиться

7 ответов

Под капотом выполняется присваивание, которое не определено для массивов.

Соответствующая часть ошибки

создается здесь / usr / lib / gcc / i586 -redhat-linux / 4.4.1 /../../../../ include / c ++ / 4.4.1 / bits / vector.tcc: 306: ошибка: массив должен быть инициализирован фигурной скобкой- вложенный инициализатор /usr/lib/gcc/i586-redhat-linux/4.4.1/../../../../include/c++/4.4.1/bits/stl_vector.h:741: создается из 'void std :: vector <_Tp, _Alloc> :: push_back (const _Tp &) [с _Tp = int [4], _Alloc = std :: allocator]' test2.cpp: 9: создается здесь / usr / lib /gcc/i586-redhat-linux/4.4.1/../../../../include/c++/4.4.1/bits/vector.tcc:312: ошибка: недопустимое присвоение массива

6
ответ дан 8 December 2019 в 03:53
поделиться

error: ISO C ++ запрещает инициализацию в массиве новая
ошибка: массив должен быть инициализируется фигурными скобками ошибка инициализатора
: недопустимый массив ошибка назначения
: запрос на член '~ int [4]' в '* __p', что является неклассового типа 'int [4]'

Чтобы понять одну из ошибок, представьте себе следующее:

void main() {
    int a[4] = {0,1,2,3};
    int b[4] = a;
}

В отличие от:

typedef struct{
    int x1,x2,x3,x4;
}  ints;

int main()
{
    ints a;
    ints b = a;
}

Или даже:

typedef struct{
    int x[4];
}  ints;

int main()
{
    ints a;
    ints b = a;
}

Массивы C / C ++ не могут быть скопированы через оператор присваивания, хотя структуры struct , содержащие массивы, могут быть.
Так что простое исправление:

typedef struct{
        int x[4];
}  ints;

typedef std::vector<ints> vec;

int main(){
        vec v;
        ints a = { {0,1,2,3} };
        v.push_back(a);
}
11
ответ дан 8 December 2019 в 03:53
поделиться

Попробуйте boost :: array вместо простых массивов. Он предоставляет STL-совместимый интерфейс для массивов фиксированного размера, поэтому его можно использовать внутри контейнеров STL. Кроме того, он реализует проверку границ ( boost :: array :: at ).

#include <boost/array.hpp>
#include <vector>

typedef std::vector< boost::array<int, 4> > vec;
int main(){
    vec v;
    boost::array<int, 4> va = {0,1,2,3};
    v.push_back(va);
}
6
ответ дан 8 December 2019 в 03:53
поделиться

Short Answer

Use with a nested

Foreach requires ant-contrib.

Updated Example for recent ant-contrib:

<target name="foo">
  <foreach target="bar" param="theFile">
    <fileset dir="${server.src}" casesensitive="yes">
      <include name="**/*.java"/>
      <exclude name="**/*Test*"/>
    </fileset>
  </foreach>
</target>

<target name="bar">
  <echo message="${theFile}"/>
</target>

This will antcall the target "bar" with the ${theFile} resulting in the current file.

Повторная встреча заключается в том, что массивы не обладают необходимой семантикой, чтобы хорошо взаимодействовать с std :: vector <> . У меня нет под рукой моей копии Страуструпа, иначе я бы дал вам ссылку.

2
ответ дан 8 December 2019 в 03:53
поделиться

Попробуйте вместо этого использовать вектор из вектор .

2
ответ дан 8 December 2019 в 03:53
поделиться

Требование к типу значения T для всех контейнеров STL, включая std :: vector , состоит в том, что T ] является Назначаемым - ISO C ++ 03 23.1 [lib.container.requirements] / 4-5. Назначаемый определяется следующим образом:

Выражение t = u , где t имеет тип T , а u имеет тип cv T , является допустимым, его возвращаемый тип - T & , а постусловие таково, что t эквивалентно u .

Массивы не соответствуют этому требованию, потому что вы не можете писать:

int a[2], b[2];
a = b;

Причина, по которой вы не можете этого сделать, заключается в том, что и a , и b в приведенном выше фрагменте кода распадаются до значений r-типа указателя в соответствии с обычными правилами C ++ для распада от массива к указателю описано в разделе 4.2 [conv.array]. Естественно, rvalue, если он не разрешен в левой части неперегруженного оператора = .

1
ответ дан 8 December 2019 в 03:53
поделиться

Массивы не являются первоклассными в C ++; вы не можете передавать их в качестве аргументов, например, функциям (они распадаются на указатели, хотя вы можете передавать указатели и ссылки на массивы). Кроме того, они не имеют семантики значений.

-1
ответ дан 8 December 2019 в 03:53
поделиться
Другие вопросы по тегам:

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