第十二周ARTS

一、Algorithm

LeetCode 350. Intersection of Two Arrays II(两个数组的交集 II)-map实现
实现代码:


#include <iostream>
#include <vector>
#include <map>
 
using namespace std;
 
// 时间复杂度: O(nlogn)
// 空间复杂度: O(n)
class Solution {
public:
	vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
 
		map<int, int> record;//第一个参数表示关键字,
							 //第二个参数是关键字对应的值
		                     //record作为计数
		for (int i = 0; i < nums1.size(); i++)
			record[nums1[i]] += 1; //提取nums1[i]的计数器并将其加1
 
		vector<int> resultVector;
		for (int i = 0; i < nums2.size(); i++)
			if (record[nums2[i]] > 0) {  //如果计数record[nums2[i]]>0
				resultVector.push_back(nums2[i]);
				record[nums2[i]] --;  //nums2[i]的计数减1
			}
 
 		return resultVector;
	}
};
 
int main() {
 
	int nums1[] = { 1, 2, 2, 1 };
	vector<int> vec1(nums1, nums1 + sizeof(nums1) / sizeof(int));
 
	int nums2[] = { 2, 2 };
	vector<int> vec2(nums2, nums2 + sizeof(nums2) / sizeof(int));
 
	vector<int> res = Solution().intersect(vec1, vec2);
	for (int i = 0; i < res.size(); i++)
		cout << res[i] << " ";
	cout << endl;
 
 	return 0;
}


二、Review

文章:C++ Pointers and Arrays

地址:
https://www.programiz.com/cpp-programming/pointers-arrays

  • 指针与数组的关系

image

image

  • Pointer and Arrays

Example:
int ptr[5] = {3, 4, 5, 5, 3};

image


三、Tip

创建一个浏览器(iterator),用于遍历线型表中的符号表记录。

步骤:

  1. 首先以读操作模式打开线型表;

  2. 之后创建一个新的浏览器;

    扫描二维码关注公众号,回复: 4470260 查看本文章
  3. 然后创建一个指向线型表的指针;

  4. 在for循环中使用浏览器函数遍历线性表记录,得到每条记录的线型名;

  5. 在退出for循环后,我们就删除浏览器,并关闭线型表。

    实现源代码:
    static void aaaMyGroupMyCommand () {
    		AcDbDatabase *pCurDb;
    		AcDbLinetypeTable *pLinetypeTbl;
    		pCurDb = acdbHostApplicationServices()->workingDatabase();
    		pCurDb->getLinetypeTable(pLinetypeTbl, AcDb::kForRead);
    		//Create a new  iterator that starts at table 
    		//beginning and  skips deleted.
    		AcDbLinetypeTableIterator *pLtIterator;
    		pLinetypeTbl->newIterator(pLtIterator);
    		//Walk the table getting every table record and
    		//printing the linetype name.
    		//
    		AcDbLinetypeTableRecord *pLtTableRcd;
    		ACHAR *pLtName;
    		for (; !pLtIterator->done(); pLtIterator->step())
    		{
    			pLtIterator->getRecord(pLtTableRcd, AcDb::kForRead);
    			pLtTableRcd->getName(pLtName);
    			pLtTableRcd->close();
    			acutPrintf(_T("\nLinetype name is: %s"), pLtName);
    			free(pLtName);
    		}
    		delete pLtIterator;
    		pLinetypeTbl->close();
    	}
    
    效果:

    在AutoCAD2018命令行输命令:MyCommandLocal,显示:


四、Share

文章:The C++ Object Model

连接:
http://www.objs.com/x3h7/cplus.htm

摘要:
对象的生命周期在创建时开始,在被销毁时结束。在C ++类定义中,具有相同名称作为类的成员函数是构造函数。这是一个在创建类的实例时自动调用的函数。构造函数通常用于将对象的数据成员初始化为其默认状态,但也可用于分配资源(内存,文件等)。对于任何类,可以声明许多构造函数,每个函数使用不同类型的参数,提供不同的初始化实例的方法。类的默认构造函数是可以在没有任何参数的情况下调用的类的构造函数。如果没有为该类明确声明构造函数,则将自动生成类的默认构造函数。类的复制构造函数是一个构造函数,可以调用它来复制该类的对象(它具有相应类型的单个参数)。例如,当一个参数对象通过值传递给一个函数,或者一个对象用另一个对象的值初始化时,就会调用一个复制构造函数。如果没有为该类显式声明复制构造函数,则将自动生成类的copy构造函数。具有相同名称作为具有前导波形符(〜)的类的成员函数是析构函数。这是在删除对象时自动调用的函数。析构函数通常用于释放为对象分配的任何内存(也可能释放在施工期间获得的任何其他资源。。类定义中不需要构造函数和析构函数。

有几种方法可以在C++程序中创建对象。一种是将变量定义为特定类,作为全局变量或块内的局部变量。在程序执行期间遇到声明时,将为该对象分配空间,并调用该对象的构造函数(如果有)。类似地,当对象变量超出范围时,会自动调用其析构函数。创建对象的另一种方法是声明一个变量,它是一个指向对象类的指针,并调用C ++ new运算符,它将为对象分配空间并为对象调用构造函数(如果有的话)。在这种情况下,指针变量必须使用delete运算符显式释放。调用new时执行对象的构造函数,并在调用delete时执行析构函数。也可以通过在表达式中显式使用构造函数来构造对象。

当一个类派生自另一个类时,它继承了它的父类’constructor和析构函数。父构造函数在derivedconstructors之前调用。析构函数以相反的方向调用,从派生类向上通过其父链。

猜你喜欢

转载自blog.csdn.net/qq_40416052/article/details/84000719