Я не уверен, насколько межплатформенный это могло бы быть, но использующие сигналы и предупреждение могли бы быть хорошим способом посмотреть на это. С небольшой работой Вы могли сделать это абсолютно универсальным также и применимым в любой ситуации.
http://docs.python.org/library/signal.html
, Таким образом, Ваш код собирается выглядеть примерно так.
import signal
def signal_handler(signum, frame):
raise Exception("Timed out!")
signal.signal(signal.SIGALRM, signal_handler)
signal.alarm(10) # Ten seconds
try:
long_function_call()
except Exception, msg:
print "Timed out!"
Определенно не такой элегантный, как Python, но нет ничего более элегантного, чем Python в C ++.
Вы можете использовать stringstream
...
#include <sstream>
//...
std::stringstream ss;
for(size_t i = 0; i < v.size(); ++i)
{
if(i != 0)
ss << ",";
ss << v[i];
}
std::string s = ss.str();
Вы могли также используйте вместо него std :: for_each
.
Мне нравится ответ 1800 года. Однако я бы переместил первую итерацию из цикла, так как результат оператора if изменяется только один раз после первой итерации
template <class T, class A>
T join(const A &begin, const A &end, const T &t)
{
T result;
A it = begin;
if (it != end)
{
result.append(*it);
++it;
}
for( ;
it!=end;
++it)
{
result.append(t);
result.append(*it);
}
return result;
}
Это, конечно, можно уменьшить до меньшего количества операторов, если хотите:
template <class T, class A>
T join(const A &begin, const A &end, const T &t)
{
T result;
A it = begin;
if (it != end)
result.append(*it++);
for( ; it!=end; ++it)
result.append(t).append(*it);
return result;
}
Другой альтернативой является использование std :: copy
] и класс ostream_iterator
:
#include <iterator> // ostream_iterator
#include <sstream> // ostringstream
#include <algorithm> // copy
std::ostringstream stream;
std::copy(array.begin(), array.end(), std::ostream_iterator<>(stream));
std::string s=stream.str();
s.erase(s.length()-1);
Также не так хорошо, как Python.
Для этой цели я создал функцию join
:
template <class T, class A>
T join(const A &begin, const A &end, const T &t)
{
T result;
for (A it=begin;
it!=end;
it++)
{
if (!result.empty())
result.append(t);
result.append(*it);
}
return result;
}
Затем использовал ее так:
std::string s=join(array.begin(), array.end(), std::string(","));
Вы можете спросить, почему я пропустил итераторы. Ну, на самом деле я хотел перевернуть массив, поэтому я использовал его так:
std::string s=join(array.rbegin(), array.rend(), std::string(","));
В идеале, я хотел бы создать шаблон до такой степени, чтобы он мог вывести тип char и использовать строковые потоки, но я не мог еще разобраться.
Это просто попытка разгадать загадку, которую дает 1800 ИНФОРМАЦИЯ в замечании о его втором решении, не имеющем универсальности, а не попытка ответить на вопрос:
template <class Str, class It>
Str join(It begin, const It end, const Str &sep)
{
typedef typename Str::value_type char_type;
typedef typename Str::traits_type traits_type;
typedef typename Str::allocator_type allocator_type;
typedef std::basic_ostringstream<char_type,traits_type,allocator_type>
ostringstream_type;
ostringstream_type result;
if(begin!=end)
result << *begin++;
while(begin!=end) {
result << sep;
result << *begin++;
}
return result.str();
}
Работает Моя машина (TM).
Используя std :: for_each и lambda, вы можете сделать кое-что интересное.
#include <iostream>
#include <sstream>
int main()
{
int array[] = {1,2,3,4};
std::for_each(std::begin(array), std::end(array),
[&std::cout, sep=' '](int x) mutable {
out << sep << x; sep=',';
});
}
См. этот вопрос для небольшого класса, который я написал. Это не приведет к печати конечной запятой. Также, если мы предположим, что C ++ 14 продолжит предоставлять нам основанные на диапазоне эквиваленты алгоритмов вроде этого:
namespace std {
// I am assuming something like this in the C++14 standard
// I have no idea if this is correct but it should be trivial to write if it does not appear.
template<typename C, typename I>
void copy(C const& container, I outputIter) {copy(begin(container), end(container), outputIter);}
}
using POI = PrefexOutputIterator;
int main()
{
int array[] = {1,2,3,4};
std::copy(array, POI(std::cout, ","));
// ",".join(map(str,array)) // closer
}