0

以下のコードを使用して、現在のタイムスタンプをミリ秒単位で、ベクターにある整数と連結しようとしています -

基本的にtimestamp.integer、文字列として持つ必要があります

struct timeval tp;
gettimeofday(&tp, NULL);
uint64_t ms = tp.tv_sec * 1000 + tp.tv_usec / 1000;


struct timeval tp;
gettimeofday(&tp, NULL);
uint64_t ms = tp.tv_sec * 1000 + tp.tv_usec / 1000;

std::vector<uint32_t> myvector;
for (uint32_t i=1; i<=5; i++) myvector.push_back(i);

std::cout << "myvector contains:";

for (std::vector<uint32_t>::iterator it = myvector.begin() ; it != myvector.end(); ++it) {
       string id = boost::lexical_cast<std::string>(ms)+"."+*it; // this line gives me exception?
       std::cout << ' ' << id;
       std::cout << '\n';
}

結果が印刷されたときに、結果をこのような文字列にしたい-

1384391287812.1
1384391287812.2
1384391287812.3
1384391287812.4
1384391287812.5

私が得る例外は -

error: no match for âoperator+â in âstd::operator+(const std::basic_string<_CharT, _Traits, _Alloc>&, const _CharT*) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>](((const char*)".")) + it.__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator*<int*, std::vector<int> >()â
4

2 に答える 2

2

イテレータのuint32_t参照先を文字列に変換したいit

   string id = boost::lexical_cast<std::string>(ms)+"."+ boost::lexical_cast<std::string>(*it); 

operator+(std::string&, uint32_t)コンパイラが正しく指示しているように、文字列に整数がないため、単純に整数を追加することはできません。

于 2013-11-14T01:24:29.630 に答える
1

値を出力することを考えると、それらを に連結する必要はありません。これは、std::stringCPU サイクルとかなりの数を浪費するだけです。代わりに、データを出力にダンプします。

for (std::vector<uint32_t>::iterator it = myvector.begin() ; it != myvector.end(); ++it) {
   std::cout << ms << '.' << *it << '\n';
}

本当に文字列を取得したい場合は、他の と連結*itする前に に変換する必要があります。使用はおそらくそれほど高価ではありませんが、その使用を最小限に抑える必要があることに注意してください(特に、特殊化されていないより興味深い型をフォーマットしようとする場合):std::stringstd::stringstd::lexical_cast<std::string>(x)

std::string base(boost::lexical_cast<std::string>(ms) + ".");
for (std::vector<uint32_t>::iterator it = myvector.begin() ; it != myvector.end(); ++it) {
   string id = base + boost::lexical_cast<std::string>(*it);
   // ...
}
于 2013-11-14T01:29:45.977 に答える