int工作但string :: size_type不是

时间:2017-11-02 12:52:44

标签: c++ string int

$events = json_decode($events, true);
$options = json_decode($options, true);

$result = array_map( function ($item) use ($options) {

    $item['options'] = array_filter($options, function ($option) use ($item) {
       return $item['id'] == $option['event_id'];
    });

    return $item;

}, $events);

print_r($result);

上述代码会导致程序在运行时崩溃。但是,如果我将 #include <string> #include <iostream> using namespace std; const string& strReverse(const string&); int main() { cout << strReverse("POT") << endl; } const string& strReverse(const string& s) { static string ret; ret = ""; for(string::size_type i = s.length()-1; i >= 0; --i) { ret += s[i]; } return ret; } 的类型更改为i则可行。

为什么?我认为使用int更安全&#34;而不是使用string::size_type等特定类型。使用int也会导致程序崩溃。

我认为auto中的类型可能与数组索引不兼容,所以我尝试将索引string::size_type转换为i,但这并不是工作要么。

2 个答案:

答案 0 :(得分:10)

因为string::size_type是无符号的,所以for循环的终止条件i >= 0将始终为真。您的选择:

  1. 使用int;

  2. 继续使用size_type但更改循环:

    for(string::size_type i = s.length(); i > 0; --i) {
        ret += s[i-1];
    }
    
  3. 或者我最喜欢的选择:

    1. 使用std::reverse_iterator并在一行中完成所有操作:
    2. 像这样:

      std::string ret(s.rbegin(), s.rend());
      

      其他一些评论:

      1. 不要返回对静态字符串的引用。它不是线程安全的。按价值返回(即返回std::string,而不是const std::string&

      2. 为了获得更好的性能,请为字符串预先分配所需的容量:ret.reserve(s.size());

答案 1 :(得分:2)

您应该按值传递并返回std::string

std::string strReverse( std::string s)
{
     for( size_t i = 0; i < s.size() / 2; ++i )
         std::swap( s[i], s[s.size()-i-1] );
     return s;
}

它会使你的功能更加简单,同时更加正确。