Как правильно объявить этот вектор? - PullRequest
1 голос
/ 08 января 2012

Я хочу использовать массив (размером count) из трех полей - длинного a, целого вектора длины 9 с именем b и логического значения c.

Чтоправильный способ объявить это?

Декларация 1:

vector <long a, vector<int> b(9), bool c> matrix(count);

Ошибки:

code.cpp: In function ‘int main()’:
code.cpp:89:49: error: template argument 1 is invalid
code.cpp:89:49: error: template argument 2 is invalid
code.cpp:89:57: error: invalid type in declaration before ‘(’ token

Декларация 2:

vector <long, vector<int>, bool> matrix(count, a, vector<int> b(9), c);

Ошибки:

code.cpp: In function ‘int main()’:
code.cpp:90:40: error: wrong number of template arguments (3, should be 2)
/usr/include/c++/4.5/bits/stl_vector.h:170:11: error: provided for ‘template<class _Tp, class _Alloc> class std::vector’
code.cpp:90:48: error: invalid type in declaration before ‘(’ token
code.cpp:90:56: error: ‘a’ was not declared in this scope
code.cpp:90:71: error: expected primary-expression before ‘b’
code.cpp:90:77: error: ‘c’ was not declared in this scope
code.cpp:90:78: error: initializer expression list treated as compound expression

Я новичок в STL и не уверен, какой здесь правильный синтаксис?

Ответы [ 3 ]

2 голосов
/ 08 января 2012
struct Fields {
  long a;
  std::array<int, 9> b, 
  bool c;
};

std::vector<Fields> matrix(count);

или

std::vector<std::tuple<long, std::array<int, 9>, bool> > matrix(count);
2 голосов
/ 08 января 2012

Шаблоны STL обычно принимают только один параметр, определяющий тип содержащихся данных (и всегда существует фиксированное количество параметров).

Чтобы получить ожидаемый эффект, вам нужно создать структуру

struct s
{
  long a;
  std::vector<int> b;
  bool c;

  s(); // Declared default constructor, see below
};

и создайте вектор объектов типа s;

std::vector<s> matrix(count);

Чтобы инициализировать объекты, содержащиеся в структуре, необходимо выполнить итерацию по вектору и назначить их вручную или объявить конструктор по умолчанию.

s::s()
: b(9) // after the colon, you can pass the constructor
// parameters for objects cointained in a structure.
{
  a = 0;
  c = false;
}
1 голос
/ 08 января 2012

Есть много способов достичь того, что вы хотите. Одним из них является создание struct, как показано ниже, и создание std::vector<> с использованием этого struct:

struct vector_elem_type
{
   long a;
   std::vector<int> b;
   bool c;
};

//vector of vector_elem_type
std::vector< struct vector_elem_type > v(9);

Другой способ - использовать boost::tuple.

// vector of tuples
std::vector< boost::tuple< long, std::vector<int>, bool > v(9);

// accessing the tuple elements    
long l = get<0>(v[0]);
std::vector<int> vi = get<1>(v[0]);
bool b = get<2>(v[0]);

Для получения более подробной информации о boost :: tuple нажмите на ссылку выше.

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