карта векторов в STL?

ES6: минимальный код я мог сделать его, это. Это делает глубокое сравнение рекурсивно stringifying все объекты, единственное ограничение не является никакими методами, или символы, выдерживают сравнение.

const compareObjects = (a, b) => { 
  let s = (o) => Object.entries(o).sort().map(i => { 
     if(i[1] instanceof Object) i[1] = s(i[1]);
     return i 
  }) 
  return JSON.stringify(s(a)) === JSON.stringify(s(b))
}

console.log(compareObjects({b:4,a:{b:1}}, {a:{b:1},b:4}));
26
задан fbrereto 4 September 2009 в 17:40
поделиться

6 ответов

Первая структура данных будет работать. Вы можете typedef часть кода, чтобы упростить работу в будущем:

typedef std::vector<MyClass>      MyClassSet;
typedef std::map<int, MyClassSet> MyClassSetMap;

MyClassSetMap map;
map.insert(MyClassSetMap::value_type(10, MyClassSet()));

или (спасибо quamrana ):

map[10] = MyClassSet();
31
ответ дан 28 November 2019 в 06:24
поделиться

Вы можете делать все, что вы предлагаете, с помощью плагина StatET для Eclipse. Это то, что я использую для разработки Sweave; он очень хорошо понимает и латекс, и R, включая подсветку синтаксиса и т. д.

Вы можете получить его здесь: http://www.walware.de/goto/statet .

Longhow Lam имеет написал хорошее руководство: http://www.splusbook.com/Rintro/R_Eclipse_StatET.pdf .

http: //www.statalgo. Они вставят значение в карту.

map[10]; // create the 10 element if it does not exist
         // using the default constructor.

Если вы собираетесь использовать вскоре после построения, то:

std::vector<MyClass>&  v = map[10];

Теперь он построен, и у вас есть локальная ссылка на объект.

3
ответ дан 28 November 2019 в 06:24
поделиться

Вы должны прочитать сообщения об ошибках компиляции. Обычно они предоставляют вам всю необходимую информацию.
Ваш код дает ошибку «незаконное использование этого типа в качестве выражения» в этой строке. Это означает, что вы используете тип, а не объект. Чтобы использовать объект, вы можете просто добавить () для вызова конструктора без аргументов.

map.insert(pair<int, vector<MyClass> >(10, vector<MyClass>()));

Кстати, вы можете использовать std :: make_pair для создания пар. Он определяет типы аргументов, поэтому не нужно их явно указывать.

map.insert( make_pair( 10, vector<MyClass>() ) );
4
ответ дан 28 November 2019 в 06:24
поделиться

Да, но ваша вторая строка должна быть:

map.insert(pair<int, vector<MyClass> >(10, vector<MyClass>()));

Здесь вставляется пара, состоящая из целого числа 10 и пустого вектора. Оба будут скопированы, и если вы имеете дело с большими векторами, вы должны быть осторожны с копиями.

Также: не вызывайте переменные "map", пока с использованием пространства имен std . Вы меня пугаете; -)

18
ответ дан 28 November 2019 в 06:24
поделиться

Используя определения типов из fbrereton, вы также можете сделать это:

typedef std::vector<MyClass>      MyClassSet;
typedef std::map<int, MyClassSet> MyClassSetMap;

MyClassSetMap map;
map[10]=MyClassSet();

Вы можете использовать оператор [] вместо insert (). Это немного снижает линейный шум.

6
ответ дан 28 November 2019 в 06:24
поделиться

Вам просто не хватает пары скобок:

map.insert(pair<int, vector<MyClass> >(10, vector<MyClass>()));

Между прочим, есть вспомогательная функция std: : make_pair, который заботится о выводе аргументов шаблона:

map.insert(make_pair(10, vector<MyClass>()));

Рассмотрение использования вместо этого указателя на динамически выделяемый вектор - довольно плохая идея, так как это возлагает на вас ответственность за управление экземпляром. Кроме того, поскольку карта никогда не должна перемещать свое содержимое в памяти, нет ничего иного в плане производительности.

sa вспомогательная функция std :: make_pair, которая заботится о выводе аргументов шаблона:

map.insert(make_pair(10, vector<MyClass>()));

Использование вместо этого указателя на динамически выделяемый вектор - довольно плохая идея, так как это возлагает на вас ответственность за управление экземпляром. Кроме того, поскольку карта никогда не должна перемещать свое содержимое в памяти, нет ничего иного в плане производительности.

sa вспомогательная функция std :: make_pair, которая заботится о выводе аргументов шаблона:

map.insert(make_pair(10, vector<MyClass>()));

Использование вместо этого указателя на динамически выделяемый вектор - довольно плохая идея, так как это возлагает на вас ответственность за управление экземпляром. Кроме того, поскольку карта никогда не должна перемещать свое содержимое в памяти, нет ничего иного в плане производительности.

2
ответ дан 28 November 2019 в 06:24
поделиться
Другие вопросы по тегам:

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