Итерация по std :: vector: unsigned vs знаковая переменная со знаком

Команда, которую вы ищете, - vacuum . Существует также прагма для включения автоматического вакуумирования.

Из документации:

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

Команда VACUUM очищает основную базу данных с помощью копируя его содержимое во временный файл базы данных и перезагружая исходный файл базы данных из копии. Это устраняет бесплатные страницы, выравнивает данные таблицы, чтобы быть смежными, и в противном случае очищает структуру файла базы данных.

blockquote>

442
задан emlai 15 February 2016 в 19:41
поделиться

9 ответов

Итерация Назад

Видит этот ответ .

Итерация Вперед

Это почти идентично. Просто измените итераторы / декремент подкачки инкрементом. Необходимо предпочесть итераторы. Некоторые люди говорят Вам использовать std::size_t в качестве индексного типа переменной. Однако это не портативно. Всегда используйте size_type определение типа контейнера (В то время как Вам могло сойти с рук только преобразование во вперед выполняющем итерации случае, это могло на самом деле пойти не так, как надо полностью в обратном случае итерации при использовании std::size_t, в случае, если std::size_t более широко, чем, что является определением типа [1 110]):

Используя станд.:: вектор

Используя итераторы

for(std::vector<T>::iterator it = v.begin(); it != v.end(); ++it) {
    /* std::cout << *it; ... */
}

Важный, всегда используйте форму инкремента префикса для итераторов, определения которых Вы не знаете. Это гарантирует Ваши выполнения кода, максимально универсальные.

Используя C++ Диапазона 11

for(auto const& value: a) {
     /* std::cout << value; ... */

Используя индексы

for(std::vector<int>::size_type i = 0; i != v.size(); i++) {
    /* std::cout << v[i]; ... */
}

Используя массивы

Используя итераторы

for(element_type* it = a; it != (a + (sizeof a / sizeof *a)); it++) {
    /* std::cout << *it; ... */
}

Используя C++ Диапазона 11

for(auto const& value: a) {
     /* std::cout << value; ... */

Используя индексы

for(std::size_t i = 0; i != (sizeof a / sizeof *a); i++) {
    /* std::cout << a[i]; ... */
}

Read в обратной итерации отвечает, к какой проблеме эти sizeof подход может привести, все же.

756
ответ дан JBaczuk 15 February 2016 в 19:41
поделиться
  • 1
    Действительно ли сценарий является исполняемым файлом для пользователя, выполняющего сценарий Python? – ThiefMaster 29 January 2011 в 08:28

Первым является корректный тип, и корректный в некотором строгом смысле. (Если Вы думаете о, размер никогда не может быть меньше, чем нуль.), Что предупреждение кажется мне одним из хороших кандидатов на то, чтобы быть проигнорированным, все же.

2
ответ дан Charlie Martin 15 February 2016 в 19:41
поделиться
for (vector<int>::iterator it = polygon.begin(); it != polygon.end(); it++)
    sum += *it; 
4
ответ дан Mehrdad Afshari 15 February 2016 в 19:41
поделиться

Немного истории:

, Чтобы представить, отрицательно ли число или не компьютерное использование, которое укусил 'знак'. int тип данных со знаком, означающий его, может содержать положительные и отрицательные величины (о-2billion к 2 миллиардам). Unsigned может только сохранить положительные числа (и так как это не пропадает впустую немного на метаданных, это может сохранить больше: 0 к приблизительно 4 миллиардам).

std::vector::size() возвраты unsigned, поскольку, как вектор мог иметь отрицательную длину?

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

По существу, если у Вас есть вектор с более тогда 2 миллиардами записей и Вы используете целое число для индексации в, Вы поразите проблемы переполнения (интервал повторится назад к отрицательным 2 миллиардам).

6
ответ дан sudo_coffee 15 February 2016 в 19:41
поделиться

Вызов к vector<T>::size() возвраты значение типа std::vector<T>::size_type, не интервал, неподписанный интервал или иначе.

Также обычно повторение по контейнеру в C++ сделано с помощью итераторы , как это.

std::vector<T>::iterator i = polygon.begin();
std::vector<T>::iterator end = polygon.end();

for(; i != end; i++){
    sum += *i;
}

, Где T является типом данных, Вы храните в векторе.

Или использование различных итеративных алгоритмов (std::transform, std::copy, std::fill, std::for_each и так далее).

16
ответ дан Jasper Bekkers 15 February 2016 в 19:41
поделиться
  • 1
    Был бы этот подход работать с сериализацией Map< Объект, Object>? – dreboi 17 February 2013 в 21:22

Используйте size_t:

for (size_t i=0; i < polygon.size(); i++)

Заключение в кавычки Википедия :

stdlib.h и stddef.h заголовочные файлы определяют тип данных, названный size_t, который используется для представления размера объекта. Библиотечные функции, которые берут размеры, ожидают, что они будут типа size_t, и sizeof оператор оценивает к size_t.

фактический тип size_t зависим от платформы; частая ошибка состоит в том, чтобы принять size_t, совпадает с неподписанным интервалом, который может привести к программным ошибкам, особенно поскольку 64-разрядная архитектура становится более распространенной.

11
ответ дан Igor Oks 15 February 2016 в 19:41
поделиться
  • 1
    И nevermind, мой nevermind..., по-видимому, jackson только уважает ключевые сериализаторы, когда у Вас есть класс, который расширяет дженерик, как class MyMap extends Map<Foo, Bar> или Карта, является полем в другом классе. Я понимаю, почему эти ситуации отличаются (метаданные уклоняются от стирания), но я don' t понимают почему Jackson isn' t просто смотрящий на тип выполнения ключевого объекта. – stickfigure 24 January 2012 в 07:34

Я обычно использую BOOST_FOREACH:

#include <boost/foreach.hpp>

BOOST_FOREACH( vector_type::value_type& value, v ) {
    // do something with 'value'
}

Это работает над контейнерами STL, массивами, строками C-стиля, и т.д.

6
ответ дан Martin Cote 15 February 2016 в 19:41
поделиться
  • 1
    Nevermind, я hadn' t понял что я can' t используют тот же FooSerializer для ключа и значения; ключевые сериализаторы должны jgen.writeFieldName (). – stickfigure 24 January 2012 в 07:29

В конкретном случае в Вашем примере я использовал бы алгоритмы STL для выполнения этого.

#include <numeric> 

sum = std::accumulate( polygon.begin(), polygon.end(), 0 );

Для более общего, но все еще довольно простого случая, я пошел бы с:

#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>

using namespace boost::lambda;
std::for_each( polygon.begin(), polygon.end(), sum += _1 );
44
ответ дан paxos1977 15 February 2016 в 19:41
поделиться
  • 1
    Я попробовал alpha=0.5, это doesn' t работают также. Это тянет сплошной прямоугольник, с не прозрачная заливка. :( – ulidtko 19 January 2011 в 09:36

Относительно ответа Йоханнеса Шауба:

for(std::vector<T*>::iterator it = v.begin(); it != v.end(); ++it) { 
...
}

Это может работать с некоторыми компиляторами, но не с gcc. Проблема здесь в том, является ли std :: vector :: iterator типом, переменной (членом) или функцией (методом). При использовании gcc мы получаем следующую ошибку:

In member function ‘void MyClass<T>::myMethod()’:
error: expected `;' before ‘it’
error: ‘it’ was not declared in this scope
In member function ‘void MyClass<T>::sort() [with T = MyClass]’:
instantiated from ‘void MyClass<T>::run() [with T = MyClass]’
instantiated from here
dependent-name ‘std::vector<T*,std::allocator<T*> >::iterator’ is parsed as a non-type, but instantiation yields a type
note: say ‘typename std::vector<T*,std::allocator<T*> >::iterator’ if a type is meant

Решение использует ключевое слово 'typename', как сказано:

typename std::vector<T*>::iterator it = v.begin();
for( ; it != v.end(); ++it) {
...
38
ответ дан 22 November 2019 в 23:03
поделиться
Другие вопросы по тегам:

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