Чтобы добавить ответ Андрея, я полагаю, что вы можете также распаковать массивы, чтобы сделать его немного чище:
[{'section': i+1, 'x': x, 'y': y} for i, [x, y] in enumerate(myarray) if i in [2, 6, 9]]
Определяет функцию в заголовке, предпочтительно в определении класса.
Определение шаблонной функции в .cpp означает, что не доберется #include
d ни в какие единицы перевода: это только будет доступно единице перевода, в которой это определяется.
Следовательно RemoveVectorDuplicates
должен быть определен в заголовке, поскольку это - единственный способ, которым компилятор может текстовая замена аргументы шаблона, следовательно инстанцирование шаблон, производя применимый класс.
Первые , можно удалить #include "foo.h"
из .cpp и добавить другой, в конец из заголовок :
#include "foo.cpp"
Это позволяет Вам последовательно организовывать свои файлы, но не обеспечивает обычные преимущества раздельной компиляции (меньшие зависимости, более быстрые и более редкие компиляции).
1121-секундный , можно просто определить шаблонную функцию в .cpp и явно инстанцировать его для всех типов, с которыми это будет когда-либо использоваться.
, Например, это может войти в конец .cpp для создания функции применимой с int
с:
template void Foo::RemoveVectorDuplicates(std::vector<int>*);
Однако это предполагает, что Вы только используете шаблоны, чтобы сохранить некоторый ввод, вместо того, чтобы обеспечить истинную степень универсальности.
Одна альтернатива, которую Вы имеете, к первому std::sort()
вектор, и затем используйте существование ранее std::unique()
функция для удаления дубликатов. Вид берет O (nlog n) время, и удаляющие дубликаты после этого берут просто O (n) время, поскольку все дубликаты появляются в единственном блоке. Ваш текущий "all-all" алгоритм сравнения берет O (n^2) время.
Вы не можете реализовать шаблонную функцию в .cpp файле. Полноценное внедрение должно быть видимо где угодно, оно инстанцируют.
Просто определяют функцию в определении класса в заголовке. Это - обычный способ реализовать шаблонные функции.
Я предложу использовать более "универсальный" подход, вместо того, чтобы передать контейнер просто получают два итератора.
Что-то как Он remove_duplicates (Это сначала, Это длится), и возвратит итератор, таким образом, можно звонить как, удалите: v.erase(remove_duplicates(v.begin(), v.end()), v.end())
.
template <typename It>
It remove_duplicate(It first, It last)
{
It current = first;
while(current != last) {
// Remove *current from [current+1,last)
It next = current;
++next;
last = std::remove(next, last, *current);
current = next;
}
return last;
}
Не связанный с Вашей проблемой (который уже был объяснен), почему это - статическая функция вместо того, чтобы находиться глобально в пространстве имен? Это было бы несколько C ++-ier.
Я не думаю тот код компиляции....
vectorToUpdate.erase, где станд.:: вектор* vectorToUpdate.... делает кто-либо еще замечает, что существует *, где должен быть &? тот код определенно не компилируется. если Вы собираетесь использовать указатель для векторизации Вас, должен использовать '->', вместо'.' я знаю, что это - на самом деле немного придирчивой гниды, но это указывает, что компилятор даже не заботится о Вашем коде...