如果您对MySQL动态字符串处理DYNAMIC_STRING和mysql动态语句感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解MySQL动态字符串处理DYNAMIC_STRING的各种细节,并
如果您对MySQL动态字符串处理DYNAMIC_STRING和mysql 动态语句感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解MySQL动态字符串处理DYNAMIC_STRING的各种细节,并对mysql 动态语句进行深入的分析,此外还有关于c – boost :: filesystem :: path :: native()返回std :: basic_string而不是std :: basic_string、c# json 转换成 dynamic 对象,然后在 dynamic 对象中动态获取指定字符串列表中的值、C++_string_basic_string::c_str() 与 basic_string::data() 区别、dynamic programming 动态规划的实用技巧。
本文目录一览:- MySQL动态字符串处理DYNAMIC_STRING(mysql 动态语句)
- c – boost :: filesystem :: path :: native()返回std :: basic_string而不是std :: basic_string
- c# json 转换成 dynamic 对象,然后在 dynamic 对象中动态获取指定字符串列表中的值
- C++_string_basic_string::c_str() 与 basic_string::data() 区别
- dynamic programming 动态规划
MySQL动态字符串处理DYNAMIC_STRING(mysql 动态语句)
MysqL中,常常会看到一些关于动态字符串的处理,列如:DYNAMIC_STRING。
为了记录动态字符串的实际长度,缓冲区的最大长度,以及每次字符串需要调整时,及时分配新的内存,以及调整长度。MysqL使用了DYNAMIC_STRING来保存动态字符串相关的信息:
typedef struct st_dynamic_string { char *str; size_t length,max_length,alloc_increment; } DYNAMIC_STRING;
在这个结构体中,str存储实际字符串的首地址,length记录字符串的实际长度,max_length记录字符串缓冲区最多可以存放多少字符,alloc_increment表示当字符串需要分配内存时,每次分配多少内存。
下面看看这个结构体的初始化过程:
my_bool init_dynamic_string( DYNAMIC_STRING *str,const char *init_str,size_t init_alloc,size_t alloc_increment ) { size_t length; DBUG_ENTER( "init_dynamic_string" ); if ( !alloc_increment ) alloc_increment = 128; length = 1; if ( init_str && (length = strlen( init_str ) + 1) < init_alloc ) init_alloc = ( (length + alloc_increment - 1) / alloc_increment) * alloc_increment; if ( !init_alloc ) init_alloc = alloc_increment; if ( !(str->str = (char *) my_malloc( init_alloc,MYF( MY_WME ) ) ) ) DBUG_RETURN( TRUE ); str->length = length - 1; if ( init_str ) memcpy( str->str,init_str,length ); str->max_length = init_alloc; str->alloc_increment = alloc_increment; DBUG_RETURN( FALSE ); }
从上述函数可以看到,初始化时,初始分配的字符串缓冲区大小init_alloc会根据需要初始的字符串来做判断。在分配好该DYNAMIC_STRING空间之后,我们会根据缓冲区的大小,字符串的实际长度,以及alloc_increment来初始化:
length:字符串的实际长度
max_length:缓冲区的最大长度
alloc_increment:空间不够时,下次分配内存的单元大小.
初始化这些内容之后,如果下次需要在该缓冲区添加更多字符,就可以根据这些值来判断是否需要对该缓冲区扩容:
my_bool dynstr_append_mem( DYNAMIC_STRING *str,const char *append,size_t length ) { char *new_ptr; if ( str->length + length >= str->max_length ) /* 如果新增字符串后,总长度超过缓冲区大小 */ { /* 需要分配多少个alloc_increment 大小的内存,才能存下新增后的字符串 */ size_t new_length = (str->length + length + str->alloc_increment) / str->alloc_increment; new_length *= str->alloc_increment; if ( !(new_ptr = (char *) my_realloc( str->str,new_length,MYF( MY_WME ) ) ) ) return(TRUE); str->str = new_ptr; str->max_length = new_length; } /* 将新分配的内容,append到str之后 */ memcpy( str->str + str->length,append,length ); str->length += length; /* 扩容之后str新的长度 */ str->str[str->length] = 0; /* Safety for C programs */ /* 字符串最后一个字符为'\0' */ return(FALSE); }
从上述代码可以看到,在字符串初始化化好之后,之后如果需要给该字符串增加新的内容,只需要根据之前存储的信息来动态的realloc就好了。由于该结构体记录了字符串相关的完整内容,所以动态的扩容会非常方便处理。
当然,除了这些,还有比如字符串截断,字符串初始设置,转义OS的引号等等:
将字符串偏移大于N之后的截断。
my_bool dynstr_trunc( DYNAMIC_STRING *str,size_t n ) { str->length -= n; str->str[str->length] = '\0'; return(FALSE); }
返回字符串中第一次出现某个字符的地址。若没有,则返回字符串结尾的地址(指向'')
char *strcend( register const char *s,register pchar c ) { for (;; ) { if ( *s == (char) c ) return( (char *) s); if ( !*s++ ) return( (char *) s - 1); } }
字符串内容扩容:
my_bool dynstr_realloc( DYNAMIC_STRING *str,size_t additional_size ) { DBUG_ENTER( "dynstr_realloc" ); if ( !additional_size ) DBUG_RETURN( FALSE ); if ( str->length + additional_size > str->max_length ) /* 如果新的字符串内容超过缓冲区的最大长度 */ { str->max_length = ( (str->length + additional_size + str->alloc_increment - 1) / str->alloc_increment) * str->alloc_increment; if ( !(str->str = (char *) my_realloc( str->str,str->max_length,MYF( MY_WME ) ) ) ) DBUG_RETURN( TRUE ); } DBUG_RETURN( FALSE ); }
对字符串用引号括起来,对其中的单引号进行转义,主要用于执行一些系统命令(system(cmd))。
比如:ls -al 会变成 ‘ls -al'
比如:ls -a'l会变成'ls -a\'l'
/* * Concatenates any number of strings,escapes any OS quote in the result then * surround the whole affair in another set of quotes which is finally appended * to specified DYNAMIC_STRING. This function is especially useful when * building strings to be executed with the system() function. * * @param str Dynamic String which will have addtional strings appended. * @param append String to be appended. * @param ... Optional. Additional string(s) to be appended. * * @ note The final argument in the list must be NullS even if no additional * options are passed. * * @return True = Success. */ my_bool dynstr_append_os_quoted( DYNAMIC_STRING *str,... ) { const char *quote_str = "\'"; const uint quote_len = 1; my_bool ret = TRUE; va_list dirty_text; ret &= dynstr_append_mem( str,quote_str,quote_len ); /* Leading quote */ va_start( dirty_text,append ); while ( append != NullS ) { const char *cur_pos = append; const char *next_pos = cur_pos; /* Search for quote in each string and replace with escaped quote */ while ( *(next_pos = strcend( cur_pos,quote_str[0] ) ) != '\0' ) { ret &= dynstr_append_mem( str,cur_pos,(uint) (next_pos - cur_pos) ); ret &= dynstr_append_mem( str,"\\",1 ); ret &= dynstr_append_mem( str,quote_len ); cur_pos = next_pos + 1; } ret &= dynstr_append_mem( str,(uint) (next_pos - cur_pos) ); append = va_arg( dirty_text,char * ); } va_end( dirty_text ); ret &= dynstr_append_mem( str,quote_len ); /* Trailing quote */ return(ret); }
通过定义动态字符串的结构体信息,每次分次进行字符串添加更多字符,都会根据字符串的当前的长度动态的扩容。而且每次扩容后,该结构体都记录的当前字符串的实际信息(当前字符串的长度,缓冲器可容纳字符串的长度,进行扩容的单元长度)。这样,动态字符串的处理操作就变得非常方便了。
c – boost :: filesystem :: path :: native()返回std :: basic_string而不是std :: basic_string
boost::filesystem::path defaultSaveFilePath( base_directory ); defaultSaveFilePath = defaultSaveFilePath / "defaultfile.name"; const std::string s = defaultSaveFilePath.native(); return save(s);
其中base_directory是类的属性,其类型是std :: string,而函数save只需要一个const std :: string&作为论点.编译器抱怨第三行代码:
错误:从’const string_type {aka const std :: basic_string}’转换为非标量类型’const string {aka const std :: basic_string}’required“
对于这个软件,我使用的是Boost 1.54(对于一些常见的库)和Qt 4.8.4(对于使用这个公共库的UI),我使用MingW GCC 4.6.2编译了所有内容.
似乎我的Windows Boost构建由于某种原因返回std :: basic_string.如果我的评估是正确的,我问你:我如何使Boost返回std :: string的实例?顺便说一下,有可能吗?
如果我对问题做了不好的评价,请您提供一些有关如何解决问题的见解.
干杯.
解决方法
请注意,std :: string只是std :: basic_string< char>,并且所有本机Windows文件函数都可以接受宽字符路径名(只调用FooW()而不是Foo()).
c# json 转换成 dynamic 对象,然后在 dynamic 对象中动态获取指定字符串列表中的值
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
string ss = TestAA();
Console.WriteLine(ss);
Console.ReadKey();
}
private static string TestAA()
{
string allowAttr = string.Empty;
string json = "{\"UserName\":\"Jack\",\"LoS\":\"Beijing\",\"Group\":\"34\"}";
// 此处模拟在不建实体类的情况下,反转将 json 返回成 dynamic 对象
var DynamicObject = JsonConvert.DeserializeObject<dynamic>(json);
//var _value = DynamicObject["LoS"];
List<string> ssList = new List<string>();
ssList.Add("LoS");
ssList.Add("Test2");
foreach(string item in ssList)
{
var value2 = DynamicObject [item];// 动态获取字符串列表中的字段去 dynamic 对象中找对应字段的值
if(value2!=null)
{
allowAttr = string.Format("{0}{1}", value2, "_Attribute");
//string allowAttr2 = string.Format("{0}{1}", value2.Value, "_Attribute");
}
}
return allowAttr;
//Console.WriteLine(DynamicObject.LoS);
//Type Ts = DynamicObject.GetType();
//object o = Ts.GetProperty("Name").GetValue(DynamicObject, null);
//string Value = Convert.ToString(o);
//if (string.IsNullOrEmpty(Value))
//{
// return null;
//}
//else
//{
// return Value;
//}
}
}
}
C++_string_basic_string::c_str() 与 basic_string::data() 区别
const value_type *c_str( ) const;
const value_type *data( ) const;
data只是返回原始数据序列,没有保证会用traits::eos(),或者说'\0'来作字符串结束.
c_str是标准的做法,返回的char*
所以,如果需要C兼容的字符串,c_str是标准的做法,data并不保证所有STL的实现的一致性。
你或许会问,c_str()的功能包含data(),那还需要data()函数干什么?看看源码:
const charT* c_str () const
{
}
原来c_str()的流程是:先调用terminate(),然后在返回data()。因此如果你对效率要求比较高,而且你的处理又不一定需要以\0的方式结束,你最好选择data()。但是对于一般的C函数中,需要以const char*为输入参数,你就要使用c_str()函数。
对于c_str() data()函数,返回的数组都是由string本身拥有,千万不可修改其内容。其原因是许多string实现的时候采用了引用机制,也就是说,有可能几个string使用同一个字符存储空间。而且你不能使用sizeof(string)来查看其大小。详细的解释和实现查看Effective STL的条款15:小心string实现的多样性。
另外在你的程序中,只在需要时才使用c_str()或者data()得到字符串,每调用一次,下次再使用就会失效,如:
string strinfo("this is Winter");
...
//最好的方式是:
foo(strinfo.c_str());
//也可以这么用:
const char* pstr=strinfo.c_str();
foo(pstr);
//不要再使用了pstr了, 下面的操作已经使pstr无效了。
strinfo += " Hello!";
foo(pstr);//错误!
会遇到什么错误?当你幸运的时候pstr可能只是指向"this is Winter Hello!"的字符串,如果不幸运,就会导致程序出现其他问题,总会有一些不可遇见的错误。总之不会是你预期的那个结果。
dynamic programming 动态规划
https://docs.python.org/3.7/library/functools.html
Example of efficiently computing Fibonacci numbers using a cache to implement a dynamic programming technique:
@lru_cache(maxsize=None)
def fib(n):
if n < 2:
return n
return fib(n-1) + fib(n-2)
>>> [fib(n) for n in range(16)]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610]
>>> fib.cache_info()
CacheInfo(hits=28, misses=16, maxsize=None, currsize=16)
New in version 3.2.
Changed in version 3.3: Added the typed option.
https://en.wikipedia.org/wiki/Dynamic_programming
https://zh.wikipedia.org/wiki/动态规划
动态规划(英语:Dynamic programming,简称DP)是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。
动态规划常常适用于有重叠子问题[1]和最优子结构性质的问题,动态规划方法所耗时间往往远少于朴素解法。
动态规划背后的基本思想非常简单。大致上,若要解一个给定问题,我们需要解其不同部分(即子问题),再根据子问题的解以得出原问题的解。
通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算量:一旦某个给定子问题的解已经算出,则将其记忆化存储,以便下次需要同一个子问题解之时直接查表。这种做法在重复子问题的数目关于输入的规模呈指数增长时特别有用。
动态规划在查找有很多重叠子问题的情况的最优解时有效。它将问题重新组合成子问题。为了避免多次解决这些子问题,它们的结果都逐渐被计算并被保存,从简单的问题直到整个问题都被解决。因此,动态规划保存递归时的结果,因而不会在解决同样的问题时花费时间。
动态规划只能应用于有最优子结构的问题。最优子结构的意思是局部最优解能决定全局最优解(对有些问题这个要求并不能完全满足,故有时需要引入一定的近似)。简单地说,问题能够分解成子问题来解决。
- 最优子结构性质。如果问题的最优解所包含的子问题的解也是最优的,我们就称该问题具有最优子结构性质(即满足最优化原理)。最优子结构性质为动态规划算法解决问题提供了重要线索。
- 无后效性。即子问题的解一旦确定,就不再改变,不受在这之后、包含它的更大的问题的求解决策影响。
- 子问题重叠性质。子问题重叠性质是指在用递归算法自顶向下对问题进行求解时,每次产生的子问题并不总是新问题,有些子问题会被重复计算多次。动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只计算一次,然后将其计算结果保存在一个表格中,当再次需要计算已经计算过的子问题时,只是在表格中简单地查看一下结果,从而获得较高的效率。
背包问题
- 最长公共子序列
- Floyd-Warshall算法
- Viterbi算法
实验代码
import time
def fib(**kwargs):
n = kwargs[''n'']
if n < 2:
return n
return fib(n=(n - 1)) + fib(n=(n - 2))
def now():
return time.time()
def runtime(f, **kwargs):
s = now()
f(**kwargs)
e = now()
return e - s
import functools
@functools.lru_cache(maxsize=None)
def fib_cache(**kwargs):
n = kwargs[''n'']
if n < 2:
return n
return fib_cache(n=(n - 1)) + fib_cache(n=(n - 2))
if __name__ == ''__main__'':
N = [2, 4, 8, 16, 32, 64]
for i in N:
print(i, '':'', fib(n=i), '','', fib_cache(n=i), runtime(fib, n=i), '','', runtime(fib_cache, n=i))
2 : 1 , 1 0.0 , 0.0
4 : 3 , 3 0.0 , 0.0
8 : 21 , 21 0.0 , 0.0 1
6 : 987 , 987 0.0009951591491699219 , 0.0
32 : 2178309 , 2178309 1.3061189651489258 , 0.0
今天的关于MySQL动态字符串处理DYNAMIC_STRING和mysql 动态语句的分享已经结束,谢谢您的关注,如果想了解更多关于c – boost :: filesystem :: path :: native()返回std :: basic_string而不是std :: basic_string、c# json 转换成 dynamic 对象,然后在 dynamic 对象中动态获取指定字符串列表中的值、C++_string_basic_string::c_str() 与 basic_string::data() 区别、dynamic programming 动态规划的相关知识,请在本站进行查询。
本文标签: