Вывести на экран вектор с диапазоном (многопоточность)

241
31 января 2018, 14:30

Мне нужно научиться использовать многопоточность при добавлении или удалении значения в векторе. Я создала функцию CopyDataTo, чтобы вывести на экран, что у меня записано в векторое после операций, и мне нельзя использовать operator[].

std::size_t CopyDataTo(T* pOutData, std::size_t firstIndex, std::size_t numData)
{
    std::size_t lastIndex = firstIndex + numData;
    const std::size_t indexAfterLast = std::min(firstIndex + numData, v_.size());
    m_.lock();
    std::copy(v_.begin() + firstIndex, v_.begin() + indexAfterLast, pOutData);
    m_.unlock();
    return *pOutData;
}
private:
   std::vector<T> v_;

Теперь я создала две функции и делаю там добавления и удаления из вектора. В main создала два потока и записала туда функции.

std::vector<int> v1;
void f3()
{
   int i = 9;
   v1.push_back(i);
   v1.back();
}
void f4()
{
   int i = 6;
   v1.push_back(i);
   v1.back();
   v1.pop_back();
}
int main()
{
  std::thread t1(f3);
  std::thread t2(f4);
  t1.join();
  t2.join();
  int pOutData;
  for(int i = 0; i < v1.Size(); ++i)
  {
    std::cout << v1.CopyDataTo(&pOutData, 0, v1.Size()) << "\n";
  }
  return 0;
}

Теперь я хочу чтобы, вы мне помогли. Я Часть кода уже исправила, спасибо Вам, теперь мне нужно мой код сделать рабочим. И нужна ваша помощь: Оксана у тебя в этой строке фигня, нужно так делать и т.д. Буду вам благодарна за помощь

UPD:

 ThreadSafeVector<int> v1;
 void f3()
 {
    v1.PushBack(5);
    v1.PushBack(9);
 }
 void f4()
 {
    v1.PushBack(2);
    v1.PushBack(1);
 }
int main()
{
    std::thread t1(f3);
    std::thread t2(f4);
    t1.join();
    t2.join();
   int* pOutData = new int[v1.Size()];
   size_t size = v1.CopyDataTo(pOutData, 0, v1.Size());
   for (int i = 0; i < size; ++i)
      std::cout << pOutData[i] << "\n";
   return 0;
}
Answer 1

std::copy работает с итераторами, а не с индексами.

std::copy(v.begin() + firstIndex, v.begin() + indexAfterLast, pOutData);
Answer 2
std::size_t rezult =

size_t встроенный тип - тот же unsigned int, не из пространства std...

std::copy(v_.begin() + firstIndex, v_.begin() + indexAfterLast, pOutData);

это ошибка, так как copy возвращает итератор записи, а не size_t... В данном примере он возвратит T*

Answer 3

Перегрузите operator<< для вашего класса:

#include <iostream>
#include <algorithm>
#include <iterator>
template<class T>
std::ostream& operator<<(std::ostream &os, const ThreadSafeVector<T> &v){
    v.lock();
    std::copy(v.begin(), v.end(), std::ostream_iterator<T>(os, " "));
    v.unlock();
    return os;
} 

Теперь можете писать так:

 std::cout << v1 << std::endl;

Я вызвал методы lock и unlock, не уверен что они есть у вас, если нет, то добавьте, т.к. иначе число элементов вектора может измениться пока работает std::copy.

Да я понимаю, что в вопросе было про диапазон. Но я не вижу где бы вам это могло понадобиться, вы все равно пытаетесь вывести все.

READ ALSO
чтение из файла txt

чтение из файла txt

Добрый вечер,

262
неправильно считывает данные из файлов .txt

неправильно считывает данные из файлов .txt

Добрый вечер еще разПрограмма неправильно считывает данные из файлов

211
Visual Studio 2015 Подвисает

Visual Studio 2015 Подвисает

Как исправить подвисания программы Visual Studio 2015?

235
Не компилируется microsip

Не компилируется microsip

Сырцы беру отсюда там уже лежит полный проект скомпилировал на visual studio 2017 с SDK 81

256