$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
,但这并不是工作要么。
答案 0 :(得分:10)
因为string::size_type
是无符号的,所以for循环的终止条件i >= 0
将始终为真。您的选择:
使用int;
继续使用size_type但更改循环:
for(string::size_type i = s.length(); i > 0; --i) {
ret += s[i-1];
}
或者我最喜欢的选择:
std::reverse_iterator
并在一行中完成所有操作:像这样:
std::string ret(s.rbegin(), s.rend());
其他一些评论:
不要返回对静态字符串的引用。它不是线程安全的。按价值返回(即返回std::string
,而不是const std::string&
。
为了获得更好的性能,请为字符串预先分配所需的容量: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;
}
它会使你的功能更加简单,同时更加正确。