Мне нужно научиться использовать многопоточность при добавлении или удалении значения в векторе. Я создала функцию 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;
}
std::copy
работает с итераторами, а не с индексами.
std::copy(v.begin() + firstIndex, v.begin() + indexAfterLast, pOutData);
std::size_t rezult =
size_t
встроенный тип - тот же unsigned int
, не из пространства std...
std::copy(v_.begin() + firstIndex, v_.begin() + indexAfterLast, pOutData);
это ошибка, так как copy возвращает итератор записи, а не size_t...
В данном примере он возвратит T*
Перегрузите 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
.
Да я понимаю, что в вопросе было про диапазон. Но я не вижу где бы вам это могло понадобиться, вы все равно пытаетесь вывести все.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Добрый вечер еще разПрограмма неправильно считывает данные из файлов
Сырцы беру отсюда там уже лежит полный проект скомпилировал на visual studio 2017 с SDK 81