Преобразуйте вектор <интервал> в строку

Я не уверен, насколько межплатформенный это могло бы быть, но использующие сигналы и предупреждение могли бы быть хорошим способом посмотреть на это. С небольшой работой Вы могли сделать это абсолютно универсальным также и применимым в любой ситуации.

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!"

85
задан jww 17 May 2018 в 19:54
поделиться

5 ответов

Определенно не такой элегантный, как 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 .

89
ответ дан 24 November 2019 в 08:13
поделиться

Мне нравится ответ 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;
}
2
ответ дан 24 November 2019 в 08:13
поделиться

Другой альтернативой является использование 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 и использовать строковые потоки, но я не мог еще разобраться.

17
ответ дан 24 November 2019 в 08:13
поделиться

Это просто попытка разгадать загадку, которую дает 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).

11
ответ дан 24 November 2019 в 08:13
поделиться

Используя 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
}
43
ответ дан 24 November 2019 в 08:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: