Передать векторную позицию в std :: for_each - PullRequest
3 голосов
/ 18 сентября 2011

У меня есть структура данных в формате разреженных сжатых столбцов.

Для моего данного алгоритма мне нужно перебрать все значения в «столбце» данных и сделать кучу вещей. В настоящее время он работает хорошо, используя обычный цикл for. Босс хочет, чтобы я перекодировал это как цикл for_each для будущего распараллеливания.

Для тех, кто не знаком с разреженным сжатым столбцом, он использует 2 (или 3) вектора для представления данных. Один вектор - это просто длинный список значений. Второй вектор - это индекс начала каждого столбца.

Текущая версия // для обработки данных в столбце 5 векторные значения; вектор colIndex; вектор rowIndex;

int column = 5;
for(int i = conIndex[5]; i != colIndex[6]; i++){
    value = values[i];
    row = rowIndex[i];
    // do stuff
}

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

Если я использую функцию std :: for_each (), я получаю значение в позиции, а не в позиции. Мне нужна сама позиция.

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

Есть мысли?

Моя проблема в том, что мне нужно знать позицию в векторе. for_each принимает итератор и отправляет значение этого итератора в функцию.

Ответы [ 2 ]

4 голосов
/ 18 сентября 2011

Используйте boost::counting_iterator<int> или реализуйте свой собственный.

1 голос
/ 18 сентября 2011
Ответ

@n.m., вероятно, лучший, но он возможен только с тем, что обеспечивает стандартная библиотека, хотя я думаю, что он очень медленный:

void your_loop_func(const T& val){
    iterator it = values.find(val);
    std::ptrdiff_t index = it - values.begin();
    value = val;
    row = rowIndices[index];
 }

И после написания этого я действительно могу рекомендовать только версию Boost counting_iterator. ;)

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