Эта строка:
vec.at(i)=vec.at(i+1);
Доступ к элементу за концом. Не очень хорошая идея добавить +1 к индексу, который уже идет в конец вектора: -)
Кроме того, обратная функция проходит по ссылке, а затем возвращает вектор, который был передан по ссылке. Это, вероятно, хорошо сделать один или другой.
Эта обратная функция использует rbegin () и rend () для инициализации нового вектора.
Наконец, я обнаружил, что если я использую getline (cin, input_line), я избегаю множества ошибок, с которыми я сталкиваюсь при попытке считывания данных непосредственно в переменные. Чем больше входных данных вы обрабатываете, тем чаще вы найдете это полезным.
Извините, что изменил typedefs обратно на std :: vector. У меня были проблемы с выполнением кода, и мне нужно было назвать переменные так, чтобы я мог их запомнить. Я стараюсь избегать имен односимвольных переменных. Отличная работа и удачи!
#include <iostream>
#include <vector>
std::vector<std::string> reverse (std::vector<std::string> vec)
{
return std::vector<std::string> (vec.rbegin(), vec.rend());
}
int main()
{
std::vector<std::string> string_vector;
std::string input_line;
std::cout << "Enter strings type esc to stop" << '\n';
while (std::getline(std::cin, input_line) && input_line != "esc")
{
string_vector.push_back(input_line);
}
std::vector<std::string> reversed = reverse(string_vector);
std::cout << reversed.size();
for (auto element:reversed)
std::cout << ":" << element << ":" ;
}
#include <boost/thread.hpp>
static boost::thread runStuffThread;
static void MyMethod(int data)
{
runStuffThread = boost::thread(boost::bind(RunStuff, data));
}
// elsewhere...
runStuffThread.join(); //blocks
CreateThread (Win32) и AfxBeginThread (MFC) являются двумя способами сделать это.
Так или иначе Ваша подпись MyMethod должна была бы измениться немного.
Править: как отмечено в комментариях и другими респондентами, CreateThread может быть плохим.
_beginthread и _beginthreadex являются функциями библиотеки времени выполнения C, и согласно документам эквивалентны Системе:: Поточная обработка:: Поток:: Запустить
Простая поточная обработка в C++ является противоречием в терминах!
Повышение выезда распараллеливает для самой близкой вещи к простому подходу, доступному сегодня.
Для минимального ответа (который на самом деле не предоставит Вам все вещи, в которых Вы нуждаетесь для синхронизации, но отвечает на Ваш вопрос буквально), см.:
http://msdn.microsoft.com/en-us/library/kdzttdcb (По сравнению с 80) .aspx
Также static
средства что-то другое в C++.
Рассмотрите использование пула потоков Win32 вместо того, чтобы вращать новые потоки для объектов работы. Вращение новые потоки расточительны - каждый поток получает 1 МБ зарезервированного адресного пространства для его стека по умолчанию, выполняет код запуска потока системы, заставляет уведомления быть поставленными почти каждому DLL в Вашем процессе и создает другой объект ядра. Пулы потоков включают Вам к потокам повторного использования для фоновых задач быстро и эффективно, и вырастут или уменьшатся на основе того, сколько задач Вы отправляете. В целом полагайте, что вращение выделило потоки для бесконечных фоновых задач, и используйте пул потоков для всего остального.
Перед Vista можно использовать QueueUserWorkItem. На Vista пул нового потока API более надежен и предлагает еще несколько расширенных настроек. Каждый заставит Ваш фоновый код начинать работать на некотором потоке пула потоков.
// Vista
VOID CALLBACK MyWorkerFunction(PTP_CALLBACK_INSTANCE instance, PVOID context);
// Returns true on success.
TrySubmitThreadpoolCallback(MyWorkerFunction, context, NULL);
// Pre-Vista
DWORD WINAPI MyWorkerFunction(PVOID context);
// Returns true on success
QueueUserWorkItem(MyWorkerFunction, context, WT_EXECUTEDEFAULT);
Другая альтернатива является pthreads - они работают над обоими окнами и Linux!
Этот сейф:
unsigned __stdcall myThread(void *ArgList) {
//Do stuff here
}
_beginthread(myThread, 0, &data);
Я должен сделать что-нибудь для освобождения памяти (как CloseHandle) после этого вызова?
CreateThread (Win32) и AfxBeginThread (MFC) являются двумя способами сделать это.
Старайтесь использовать _beginthread, если необходимо использовать библиотеку времени выполнения C (CRT) все же.
Если бы Вы действительно не хотите использовать третье лицо, освобождает (я рекомендовал бы повышение:: распараллельте, как объяснено в другом anwsers), необходимо использовать Win32API:
static void MyMethod(int data)
{
int data = 3;
HANDLE hThread = ::CreateThread(NULL,
0,
&RunStuff,
reinterpret_cast<LPVOID>(data),
0,
NULL);
// you can do whatever you want here
::WaitForSingleObject(hThread, INFINITE);
::CloseHandle(hThread);
}
static DWORD WINAPI RunStuff(LPVOID param)
{
int data = reinterpret_cast<int>(param);
//long running operation here
return 0;
}
Для win32 только и без дополнительных библиотек можно использовать функцию CreateThread http://msdn.microsoft.com/en-us/library/ms682453 (По сравнению с 85) .aspx
Там существует многие межплатформенные библиотеки поточной обработки C++ с открытым исходным кодом, которыми Вы могли пользоваться:
Среди них:
QT
Intel
Поток Повышения TBB
Путем Вы описываете это, я думаю, что или поток Intel TBB или Повышения будет прекрасен.
Пример Intel TBB:
class RunStuff
{
public:
// TBB mandates that you supply () operator
void operator ()()
{
// long running operation here
}
};
// Here's sample code to instantiate it
#include <tbb/tbb_thread.h>
tbb::tbb_thread my_thread(RunStuff);
Пример потока повышения:
http://www.ddj.com/cpp/211600441
Спокойный пример:
http://doc.trolltech.com/4.4/threads-waitconditions-waitconditions-cpp.html
(Я не думаю, что это удовлетворяет Вашим потребностям, но просто включенный здесь для полноты; необходимо наследовать QThread, реализация, пусто выполненная (), и назвать QThread:: запустите ()):
Если Вы только программируете в Windows и не заботитесь о межплатформенном, возможно, Вы могли бы использовать поток Windows непосредственно:
http://www.codersource.net/win32_multithreading.html