ACE_INET_Addr类,在这个ACE_网络框架中,应该是比较重要的辅助类,该类主要封装了C SOCKET 的地址对象,通过外观封装的模式,把struct sockaddr_in封装在内。方便用户的操作。

因此个人认为掌握此类的常用构造方法和常用的成员函数,并深刻的理解,对于后续的学习ACE或者开发ACE网络应用程序应该会起到很大的帮助。工欲用其器、必先利其器。就先让我们把ACE_INET_Addr对象深刻的牢记在心中吧。

  1. /* -*- C++ -*- */
  2. //=============================================================================
  3. /**
  4. *  @file    INET_Addr.h
  5. *
  6. *  $Id: INET_Addr.h 78617 2007-06-27 20:40:19Z mesnier_p $
  7. *
  8. *  @author Douglas C. Schmidt <schmidt@cs.wustl.edu>
  9. */
  10. //=============================================================================
  11. #ifndef ACE_INET_ADDR_H
  12. #define ACE_INET_ADDR_H
  13. #include /**/ "ace/pre.h"
  14. #include "ace/Sock_Connect.h"
  15. #if !defined (ACE_LACKS_PRAGMA_ONCE)
  16. # pragma once
  17. #endif /* ACE_LACKS_PRAGMA_ONCE */
  18. #include "ace/Addr.h"
  19. #if defined(ACE_VXWORKS)
  20. // Needed to get INET_ADDR_LEN
  21. #  include /**/ "inetLib.h"
  22. #endif /* ACE_VXWORKS */
  23. ACE_BEGIN_VERSIONED_NAMESPACE_DECL
  24. /**
  25. * @class ACE_INET_Addr
  26. *
  27. * @brief Defines a C++ wrapper facade for the Internet domain address
  28. * family format.
  29. */
  30. class ACE_Export ACE_INET_Addr : public ACE_Addr
  31. {
  32. public:
  33. // = Initialization methods.
  34. /// Default constructor.
  35. /// 默认构造函数
  36. ACE_INET_Addr (void);
  37. /// Copy constructor.
  38. /// 拷贝构造函数
  39. ACE_INET_Addr (const ACE_INET_Addr &);
  40. /// Creates an ACE_INET_Addr from a sockaddr_in structure.
  41. /// 使用参数@addr 地址初始化ACE_INET_Addr对象。
  42. /// 参数@len 为 @addr结构地址对象的长度,使用 sizeof(strcut sockaddr_in)
  43. ACE_INET_Addr (const sockaddr_in *addr, int len);
  44. /// Creates an ACE_INET_Addr from a <port_number> and the remote
  45. /// <host_name>. The port number is assumed to be in host byte order.
  46. /// To set a port already in network byte order, please @see set().
  47. /// Use address_family to select IPv6 (PF_INET6) vs. IPv4 (PF_INET).
  48. /// 使用参数 @port_number 和 host_name 构造一个ACE_INET_Addr对象。
  49. /// @port_number应该为主机字节序,构造函数需要把它转换了网络字节序。
  50. /// 如果port_number为网络字节序,请使用 set成员函数或者set_port_number成员函数。
  51. /// @address_family 用于指定ACE_INET_Addr的地址类型PF_INET(IPv4)或者PF_INET6(IPv6)
  52. ACE_INET_Addr (u_short port_number,
  53. const char host_name[],
  54. int address_family = AF_UNSPEC);
  55. /**
  56. * Initializes an ACE_INET_Addr from the <address>, which can be
  57. * "ip-number:port-number" (e.g., "tango.cs.wustl.edu:1234" or
  58. * "128.252.166.57:1234").  If there is no ':' in the <address> it
  59. * is assumed to be a port number, with the IP address being
  60. * INADDR_ANY.
  61. * 使用参数@address初始化一个ACE_INET_Addr对象。
  62. * address的格式为 ip-number:port-number 或者 port-number.
  63. * ip-number 可以为点分号的IP地址,也可是是域名地址。
  64. * 如果参数@address没有提供 ip-number,只提供port-number时,地址被初始化为INADDR_ANY
  65. * port-number 为主机字节序。
  66. */
  67. explicit ACE_INET_Addr (const char address[],
  68. int address_family = AF_UNSPEC);
  69. /**
  70. * Creates an ACE_INET_Addr from a <port_number> and an Internet
  71. * <ip_addr>.  This method assumes that <port_number> and <ip_addr>
  72. * are in host byte order. If you have addressing information in
  73. * network byte order, @see set().
  74. * 使用主机字节序的@port_number 和 @ip_addr初始化一个ACE_INET_Addr对象。
  75. * 如port_number或者 ip_addr为网络字节序时,请使用 set成员函数。
  76. */
  77. explicit ACE_INET_Addr (u_short port_number,
  78. ACE_UINT32 ip_addr = INADDR_ANY);
  79. /// Uses <getservbyname> to create an ACE_INET_Addr from a
  80. /// <port_name>, the remote <host_name>, and the <protocol>.
  81. /// 通过 getservbyname API获得port_name的端口,eg port_name="ftp"时,得到的端口是21.
  82. ACE_INET_Addr (const char port_name[],
  83. const char host_name[],
  84. const char protocol[] = "tcp");
  85. /**
  86. * Uses <getservbyname> to create an ACE_INET_Addr from a
  87. * <port_name>, an Internet <ip_addr>, and the <protocol>.  This
  88. * method assumes that <ip_addr> is in host byte order.
  89. */
  90. ACE_INET_Addr (const char port_name[],
  91. ACE_UINT32 ip_addr,
  92. const char protocol[] = "tcp");
  93. #if defined (ACE_HAS_WCHAR)
  94. ACE_INET_Addr (u_short port_number,
  95. const wchar_t host_name[],
  96. int address_family = AF_UNSPEC);
  97. explicit ACE_INET_Addr (const wchar_t address[],
  98. int address_family = AF_UNSPEC);
  99. ACE_INET_Addr (const wchar_t port_name[],
  100. const wchar_t host_name[],
  101. const wchar_t protocol[] = ACE_TEXT_WIDE ("tcp"));
  102. ACE_INET_Addr (const wchar_t port_name[],
  103. ACE_UINT32 ip_addr,
  104. const wchar_t protocol[] = ACE_TEXT_WIDE ("tcp"));
  105. #endif /* ACE_HAS_WCHAR */
  106. /// Default dtor.
  107. ~ACE_INET_Addr (void);
  108. // = Direct initialization methods.
  109. // = 直接初始化方法。当使用默认构造函数创建一个ACE_INET_Addr对象时,可以使用
  110. // 下面的来设置一个ACE_INET_Addr对象的地址和端口。
  111. // These methods are useful after the object has been constructed.
  112. /// Initializes from another ACE_INET_Addr.
  113. /// 使用一个已经存在的ACE_INET_Addr对象来初始化本对象。
  114. int set (const ACE_INET_Addr &);
  115. /**
  116. * Initializes an ACE_INET_Addr from a <port_number> and the
  117. * remote <host_name>.
  118. * 使用参数@port_number 和@host_name初始化 ACE_INET_Addr 对象。
  119. * If <encode> is non-zero then <port_number> is
  120. * converted into network byte order, otherwise it is assumed to be
  121. * in network byte order already and are passed straight through.
  122. * 如果参数@encode 为TRUE(非零),表示需要set函数内部进行网络字节序的转换,
  123. * 也就是此时 port_number属于主机字节序的值。否则port_number就是已经是网络
  124. * 字节序了,无需进行转换,直接赋值即可。
  125. * address_family can be used to select IPv4/IPv6 if the OS has
  126. * IPv6 capability (ACE_HAS_IPV6 is defined). To specify IPv6, use
  127. * the value AF_INET6. To specify IPv4, use AF_INET.
  128. * 参数@address_family 用于选定IPv4/IPv6的地址格式。使用AF_INET指定IPv4地址,
  129. * AF_INET6指定IPv4地址格式。
  130. */
  131. int set (u_short port_number,
  132. const char host_name[],
  133. int encode = 1,
  134. int address_family = AF_UNSPEC);
  135. /**
  136. * Initializes an ACE_INET_Addr from a @a port_number and an Internet
  137. * @a ip_addr.
  138. * 使用参数@port_number 和参数 @ip_addr初始化 ACE_INET_Addr对象。
  139. * If @a encode is non-zero then the port number and IP address
  140. * are converted into network byte order, otherwise they are assumed to be
  141. * in network byte order already and are passed straight through.
  142. * 如果参数@encode 为TRUE(非零)时,表面 @port_number、@ip_addr 为主机字节序,
  143. * set 函数内部需要把它们转换为网络字节序。否则它们为网络字节序,无需而外的转换
  144. * 直接赋值。
  145. * If <map> is non-zero and IPv6 support has been compiled in,
  146. * then this address will be set to the IPv4-mapped IPv6 address of it.
  147. */
  148. int set (u_short port_number,
  149. ACE_UINT32 ip_addr = INADDR_ANY,
  150. int encode = 1,
  151. int map = 0);
  152. /// Uses <getservbyname> to initialize an ACE_INET_Addr from a
  153. /// <port_name>, the remote <host_name>, and the <protocol>.
  154. int set (const char port_name[],
  155. const char host_name[],
  156. const char protocol[] = "tcp");
  157. /**
  158. * Uses <getservbyname> to initialize an ACE_INET_Addr from a
  159. * <port_name>, an <ip_addr>, and the <protocol>.  This assumes that
  160. * <ip_addr> is already in network byte order.
  161. */
  162. int set (const char port_name[],
  163. ACE_UINT32 ip_addr,
  164. const char protocol[] = "tcp");
  165. /**
  166. * Initializes an ACE_INET_Addr from the @a addr, which can be
  167. * "ip-number:port-number" (e.g., "tango.cs.wustl.edu:1234" or
  168. * "128.252.166.57:1234").  If there is no ':' in the <address> it
  169. * is assumed to be a port number, with the IP address being
  170. * INADDR_ANY.
  171. * 参数@addr格式为 %s:%d 或者 %d。
  172. * %s为 IP地址或者域名, %d 为服务端口号。
  173. * 也就是如果addr 数组中没有 冒号':' 时,此时地址被设置为 INADD_ANY,端口为@addr指定。
  174. */
  175. int set (const char addr[], int address_family = AF_UNSPEC);
  176. /// Creates an ACE_INET_Addr from a sockaddr_in structure.
  177. /// 使用 sockaddr_in 结构设置ACE_INET_Addr对象。
  178. int set (const sockaddr_in *,
  179. int len);
  180. #if defined (ACE_HAS_WCHAR)
  181. /**
  182. * 定义宽字符支持的接口。
  183. */
  184. int set (u_short port_number,
  185. const wchar_t host_name[],
  186. int encode = 1,
  187. int address_family = AF_UNSPEC);
  188. int set (const wchar_t port_name[],
  189. const wchar_t host_name[],
  190. const wchar_t protocol[] = ACE_TEXT_WIDE ("tcp"));
  191. int set (const wchar_t port_name[],
  192. ACE_UINT32 ip_addr,
  193. const wchar_t protocol[] = ACE_TEXT_WIDE ("tcp"));
  194. int set (const wchar_t addr[], int address_family = AF_UNSPEC);
  195. #endif /* ACE_HAS_WCHAR */
  196. /// Return a pointer to the underlying network address.
  197. /// 获得原始的网络地址指针,根据IPv4或者IPv6,可以得到一个 struct sockaddr地址的指针。
  198. virtual void *get_addr (void) const;
  199. int get_addr_size(void) const;
  200. /// Set a pointer to the address.
  201. virtual void set_addr (void *, int len);
  202. /// Set a pointer to the address.
  203. virtual void set_addr (void *, int len, int map);
  204. /**
  205. * Transform the current ACE_INET_Addr address into string format.
  206. * If <ipaddr_format> is non-0 this produces "ip-number:port-number"
  207. * (e.g., "128.252.166.57:1234"), whereas if <ipaddr_format> is 0
  208. * this produces "ip-name:port-number" (e.g.,
  209. * "tango.cs.wustl.edu:1234").  Returns -1 if the @a size of the
  210. * <buffer> is too small, else 0.
  211. * 把地址转换为字符串, 参数@ipaddr_format指定转换的格式,如果
  212. * @ipaddr_format为 TRUE(非零)时,转换为点分十进制的IP地址格式。否则
  213. * 可能转换为域名的地址格式。
  214. * @return 成功时返回 0,否则返回 -1,此时参数@buffer的长度太短。
  215. *
  216. */
  217. virtual int addr_to_string (ACE_TCHAR buffer[],
  218. size_t size,
  219. int ipaddr_format = 1) const;
  220. /**
  221. * Initializes an ACE_INET_Addr from the @a address, which can be
  222. * "ip-addr:port-number" (e.g., "tango.cs.wustl.edu:1234"),
  223. * "ip-addr:port-name" (e.g., "tango.cs.wustl.edu:telnet"),
  224. * "ip-number:port-number" (e.g., "128.252.166.57:1234"), or
  225. * "ip-number:port-name" (e.g., "128.252.166.57:telnet").  If there
  226. * is no ':' in the <address> it is assumed to be a port number,
  227. * with the IP address being INADDR_ANY.
  228. * 把字符串表示的地址格式转换为 ACE_INET_Addr对象的地址。
  229. * 地址格式可以为 [{ip-addr|ip-number}:]{port-number|port-name}
  230. * 如果地址格式没有包括冒号':'时,函数内部认为只是设置 port-number|port-name,
  231. * 地址被设置为 INADDR_ANY
  232. */
  233. virtual int string_to_addr (const char address[],
  234. int address_family = AF_UNSPEC);
  235. #if defined (ACE_HAS_WCHAR)
  236. /*
  237. virtual int string_to_addr (const char address[]);
  238. */
  239. #endif /* ACE_HAS_WCHAR */
  240. /**
  241. * Sets the port number without affecting the host name.  If
  242. * <encode> is enabled then <port_number> is converted into network
  243. * byte order, otherwise it is assumed to be in network byte order
  244. * already and are passed straight through.
  245. * 设置ACE_INET_Addr对象的端口部分,不影响地址域。
  246. * 参数@encode 的意思等同 set函数的@encode参数。
  247. */
  248. void set_port_number (u_short,
  249. int encode = 1);
  250. /**
  251. * Sets the address without affecting the port number.  If
  252. * <encode> is enabled then <ip_addr> is converted into network
  253. * byte order, otherwise it is assumed to be in network byte order
  254. * already and are passed straight through.  The size of the address
  255. * is specified in the @a len parameter.
  256. * If <map> is non-zero, IPv6 support has been compiled in, and
  257. * <ip_addr> is an IPv4 address, then this address is set to the IPv4-mapped
  258. * IPv6 address of it.
  259. * 设置ACE_INET_Addr对象的地址部分,不改变地址对象的端口。
  260. * 参数@enable与set函数的@encode一致。
  261. * 参数@len指定 参数@ip_addr的长度。
  262. * 参数@map 为 TRUE(非零)是,表示支持IPv6地址格式,否则为IPv4的地址。
  263. */
  264. int set_address (const char *ip_addr,
  265. int len,
  266. int encode = 1,
  267. int map = 0);
  268. #if (defined (__linux__) || defined (ACE_WIN32)) && defined (ACE_HAS_IPV6)
  269. /**
  270. * Sets the interface that should be used for this address. This only has
  271. * an effect when the address is link local, otherwise it does nothing.
  272. */
  273. int set_interface (const char *intf_name);
  274. #endif /* (__linux__ || ACE_WIN32) && ACE_HAS_IPV6 */
  275. /// Return the port number, converting it into host byte-order.
  276. u_short get_port_number (void) const;
  277. /**
  278. * Return the character representation of the name of the host,
  279. * storing it in the <hostname> (which is assumed to be
  280. * <hostnamelen> bytes long).  This version is reentrant.  If
  281. * <hostnamelen> is greater than 0 then <hostname> will be
  282. * NUL-terminated even if -1 is returned.
  283. */
  284. int get_host_name (char hostname[],
  285. size_t hostnamelen) const;
  286. #if defined (ACE_HAS_WCHAR)
  287. int get_host_name (wchar_t hostname[],
  288. size_t hostnamelen) const;
  289. #endif /* ACE_HAS_WCHAR */
  290. /**
  291. * Return the character representation of the hostname.  This
  292. * version is non-reentrant since it returns a pointer to a static
  293. * data area.  You should therefore either (1) do a "deep copy" of
  294. * the address returned by get_host_name(), e.g., using strdup() or
  295. * (2) use the "reentrant" version of get_host_name() described
  296. * above.
  297. */
  298. const char *get_host_name (void) const;
  299. /**
  300. * Return the "dotted decimal" Internet address representation of
  301. * the hostname storing it in the @a addr (which is assumed to be
  302. * <addr_size> bytes long).  This version is reentrant.
  303. */
  304. const char *get_host_addr (char *addr, int addr_size) const;
  305. /**
  306. * Return the "dotted decimal" Internet address representation of
  307. * the hostname.  This version is non-reentrant since it returns a
  308. * pointer to a static data area.  You should therefore either
  309. * (1) do a "deep copy" of the address returned by get_host_addr(), e.g.,
  310. * using strdup() or (2) use the "reentrant" version of
  311. * get_host_addr() described above.
  312. */
  313. const char *get_host_addr (void) const;
  314. /// Return the 4-byte IP address, converting it into host byte
  315. /// order.
  316. ACE_UINT32 get_ip_address (void) const;
  317. /// Return @c true if the IP address is INADDR_ANY or IN6ADDR_ANY.
  318. bool is_any (void) const;
  319. /// Return @c true if the IP address is IPv4/IPv6 loopback address.
  320. bool is_loopback (void) const;
  321. /// Return @c true if the IP address is IPv4/IPv6 multicast address.
  322. bool is_multicast (void) const;
  323. #if defined (ACE_HAS_IPV6)
  324. /// Return @c true if the IP address is IPv6 linklocal address.
  325. bool is_linklocal (void) const;
  326. /// Return @c true if the IP address is IPv4-mapped IPv6 address.
  327. bool is_ipv4_mapped_ipv6 (void) const;
  328. /// Return @c true if the IP address is IPv4-compatible IPv6 address.
  329. bool is_ipv4_compat_ipv6 (void) const;
  330. #endif /* ACE_HAS_IPV6 */
  331. /**
  332. * Returns @c true if @c this is less than @a rhs.  In this context,
  333. * "less than" is defined in terms of IP address and TCP port
  334. * number.  This operator makes it possible to use @c ACE_INET_Addrs
  335. * in STL maps.
  336. * 定义次函数,有何实际的应用吗?比较2个地址的大小有何实际意义?
  337. *
  338. */
  339. bool operator < (const ACE_INET_Addr &rhs) const;
  340. /// Compare two addresses for equality.  The addresses are considered
  341. /// equal if they contain the same IP address and port number.
  342. /// 比较2个地址是否相等,包括地址部分和端口部分。
  343. bool operator == (const ACE_INET_Addr &SAP) const;
  344. /// Compare two addresses for inequality.
  345. /// 比较2个地址是否不相等
  346. bool operator != (const ACE_INET_Addr &SAP) const;
  347. /// A variation of the equality operator, this method only compares the
  348. /// IP address and ignores the port number.
  349. /// 比较2个地址是否相等,只比较地址部分,忽略端口部分。
  350. bool is_ip_equal (const ACE_INET_Addr &SAP) const;
  351. /// Computes and returns hash value.
  352. virtual u_long hash (void) const;
  353. /// Dump the state of an object.
  354. void dump (void) const;
  355. /// Declare the dynamic allocation hooks.
  356. ACE_ALLOC_HOOK_DECLARE;
  357. private:
  358. /// Insure that @a hostname is properly null-terminated.
  359. int get_host_name_i (char hostname[], size_t hostnamelen) const;
  360. // Methods to gain access to the actual address of
  361. // the underlying internet address structure.
  362. void *ip_addr_pointer (void) const;
  363. int ip_addr_size (void) const;
  364. int determine_type (void) const;
  365. /// Initialize underlying inet_addr_ to default values
  366. void reset (void);
  367. /// Underlying representation.
  368. /// This union uses the knowledge that the two structures share the
  369. /// first member, sa_family (as all sockaddr structures do).
  370. union
  371. {
  372. sockaddr_in  in4_;
  373. #if defined (ACE_HAS_IPV6)
  374. sockaddr_in6 in6_;
  375. #endif /* ACE_HAS_IPV6 */
  376. } inet_addr_;
  377. #if defined (ACE_VXWORKS)
  378. char buf_[INET_ADDR_LEN];
  379. #endif
  380. };
  381. ACE_END_VERSIONED_NAMESPACE_DECL
  382. #if defined (__ACE_INLINE__)
  383. #include "ace/INET_Addr.inl"
  384. #endif /* __ACE_INLINE__ */
  385. #include /**/ "ace/post.h"
  386. #endif /* ACE_INET_ADDR_H */

总结:

1.在set、set_port_number、set_address中都提供了一个参数@encode,此参数在构造函数的参数中并没有提供。因为也意味着,使用任何一个构造函数来创建一个ACE_INET_Addr对象时,其地址和端口必须是主机字节序的。如果地址或者端口为网络字节序时,必须转换为主机字节序才可以使用构造函数。或者使用默认的构造函数,在通过set、set_port_number、set_address等成员函数,指定encode参数为FALSE(0)时,也可以直接把网络字节序的地址和端口设置给ACE_INET_Addr对象。如果地址和端口是2中不同的字节序,需要分别使用set_address和set_port_number进行设置,否则就可以使用set函数一次性设置地址和端口。

2.比较2个ACE_INET_Addr对象的相等性。 根据情况使用不同的成员函数。

地址和端口都要相等时,使用 ==进行比较。

只比较地址时,忽略端口时。使用 is_ip_equal 成员函数。

ACE_INET_Addr类 API的更多相关文章

  1. Lucene学习入门——核心类API

    本文讲解Lucene中,创建索引.搜索等常用到的类API 搜索操作比索引操作重要的多,因为索引文件只被创建一次,却要被搜索多次. 索引过程的核心类: 执行简单的索引过程需要如下几个类:IndexWri ...

  2. StringUtils类API及使用方法详解

    StringUtils类API及使用方法详解 StringUtils方法概览 判空函数 1)StringUtils.isEmpty(String str) 2)StringUtils.isNotEmp ...

  3. 通讯服务类API调用的代码示例合集:短信服务、手机号归属地查询、电信基站查询等

    以下示例代码适用于 www.apishop.net 网站下的API,使用本文提及的接口调用代码示例前,您需要先申请相应的API服务. 短信服务:通知类和验证码短信,全国三网合一通道,5秒内到达,费用低 ...

  4. 天气类API调用的代码示例合集:全国天气预报、实时空气质量数据查询、PM2.5空气质量指数等

    以下示例代码适用于 www.apishop.net 网站下的API,使用本文提及的接口调用代码示例前,您需要先申请相应的API服务. 全国天气预报:数据来自国家气象局,可根据地名.经纬度GPS.IP查 ...

  5. 位置信息类API调用的代码示例合集:中国省市区查询、经纬度地址转换、POI检索等

    以下示例代码适用于 www.apishop.net 网站下的API,使用本文提及的接口调用代码示例前,您需要先申请相应的API服务. 中国省市区查询:2017最新中国省市区地址 经纬度地址转换:经纬度 ...

  6. 生活常用类API调用的代码示例合集:邮编查询、今日热门新闻查询、区号查询等

    以下示例代码适用于 www.apishop.net 网站下的API,使用本文提及的接口调用代码示例前,您需要先申请相应的API服务. 邮编查询:通过邮编查询地名:通过地名查询邮编 今日热门新闻查询:提 ...

  7. 开发工具类API调用的代码示例合集:六位图片验证码生成、四位图片验证码生成、简单验证码识别等

    以下示例代码适用于 www.apishop.net 网站下的API,使用本文提及的接口调用代码示例前,您需要先申请相应的API服务. 六位图片验证码生成:包括纯数字.小写字母.大写字母.大小写混合.数 ...

  8. 出行服务类API调用的代码示例合集:长途汽车查询、车型大全、火车票查询等

    以下示例代码适用于 www.apishop.net 网站下的API,使用本文提及的接口调用代码示例前,您需要先申请相应的API服务. 长途汽车查询:全国主要城市的长途汽车时刻查询,汽车站查询 车型大全 ...

  9. 常用类-API文档-Integer

    package IntegerTest;import java.util.Base64.Decoder; public class test01 { /** * 包装类的基本数据类型 * int =& ...

随机推荐

  1. Linq里where出现null的问题

    今天遇到一个问题,怎么在where里判断一个字段是否为null,并且这个字段不是字符串string类型,而是int和GUID类型,折腾了半天终于搞明白了.(由于项目是我半路接手的,问题是前期的同事给我 ...

  2. 【题解】Atcoder ARC#67 F-Yakiniku Restaurants

    觉得我的解法好简单,好优美啊QAQ 首先想想暴力怎么办.暴力的话,我们就枚举左右端点,然后显然每张购物券都取最大的值.这样的复杂度是 \(O(n ^{2} m)\) 的.但是这样明显能够感觉到我们重复 ...

  3. [LOJ2983] [WC2019] 数树

    题目链接 LOJ:https://loj.ac/problem/2983 BZOJ:https://lydsy.com/JudgeOnline/problem.php?id=5475 洛谷:https ...

  4. BZOJ5251:[九省联考2018]劈配——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=5251 https://loj.ac/problem/2477  <-可以看数据 https: ...

  5. 洛谷3800:Power收集——题解

    https://www.luogu.org/problemnew/show/P3800 可以把游戏界面理解成一个N行M列的棋盘,有K个格子上有P点,其价值为val(i,j) 初始灵梦可以选择在第一行的 ...

  6. iOS-防止向SQLite数据库中插入重复数据记录:

    原则:先检测该数据库的指定表中,是否已经存在我们要插入的这条数据记录,若已经存在,则不插入这条数据记录(即忽略此次插入操作),若尚不存在,才插入这条数据记录(即才执行此次插入操作) 我们这里使用的是F ...

  7. ubuntu启动脚本

    下午分析了一下mysql的启动脚本,找到这篇,记录一下,目前很多服务都是以这种方式封装,后面自己写来借鉴一下 http://blog.fens.me/linux-upstart/

  8. 【题解】Matrix BZOJ 4128 矩阵求逆 离散对数 大步小步算法

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4128 大水题一道 使用大步小步算法,把数字的运算换成矩阵的运算就好了 矩阵求逆?这么基础的线 ...

  9. NYOJ 747贪心+dp

    蚂蚁的难题(三) 时间限制:2000 ms  |  内存限制:65535 KB 难度:4   描述 蚂蚁终于把尽可能多的食材都搬回家了,现在开始了大厨计划. 已知一共有 n 件食材,每件食材有一个美味 ...

  10. 正确理解WPF中的TemplatedParent

    (注:Logical Tree中文称为逻辑树,Visual Tree中文称为可视化树或者视觉树,由于名称不是很统一,文中统一用英文名称代表两个概念,况且VisualTreeHelper和Logical ...