65,186
社区成员




#ifdef __STL_TO_LIST__
#define VECTOR(type,L) vector<type>L(#L)
#define MAP(type1,type2,D) map<type1,type2>D(#D)
#define SET_NAME(T) T.setName(#T);
//------------------------------
#else
#define VECTOR(type,V) vector<type>V
#define MAP(type1,type2,D) map<type1,type2>D
#endif
#ifdef __STL_TO_LIST__
template<typename T>
inline void setNames(vector<vector<T>>&Vt__)
{
int iSize=Vt__.size();
char*Vname=Vt__.getName();int iLen=strlen(Vname);
if(Vname==NULL)
{printf("!!!V没有name\n");return ;}
for(int i=0;i<iSize;i++)
{
char cNUM[10], c_[10]="_";
itoa(i,cNUM,10);strcat(c_,cNUM);//_0
char*cNameToSet=merge(Vname,c_);//V_0
Vt__[i].setName(cNameToSet);
delete[]cNameToSet;
}
}
#endif
//========================================================
#ifdef __STL_TO_LIST__
template<typename T>
inline void RESIZE(int iSzie,vector<vector<T>>&Vt__)
{
Vt__.resize(iSzie);
setNames(Vt__);
}
#else
#define RESIZE(iSzie,Vt__) Vt__.resize(iSzie)
#endif
//========================================================
#ifdef __STL_TO_LIST__
template<typename T>
inline void RESIZE2(int iSzie,vector<T>&Value,vector<vector<T>>&Vt__)
{
Vt__.resize(iSzie,Value);
setNames(Vt__);
}
#else
#define RESIZE2(iSzie,Value,Vt__) Vt__.resize(iSzie,Value)
#endif
//========================================================
#ifdef __STL_TO_LIST__
template<typename T>
inline void ASSIGN(int iSzie,vector<T>&Value,vector<vector<T>>&Vt__)
{
Vt__.assign(iSzie,Value);
setNames(Vt__);
}
#else
#define ASSIGN(iSzie,Value,Vt__) Vt__.assign(iSzie,Value)
#endif
这是测试 代码
#define __STL_TO_LIST__
void main()
{
VECTOR(vector<float>,VV测试) ;vector<float>Vf(2,3);
//VV测试.setName("MY");SET_NAME(VV测试);//通过测试
RESIZE2(5,Vf,VV测试);//通过测试
RESIZE(3,VV测试);//通过测试
#ifdef __STL_TO_LIST__
printf("typeid(VV测试)= %s○ name= %s\n",typeid(VV测试).name(),VV测试.getName());
//VV测试.clear();VV测试=VV;//就算clear()或赋值,也不会修改名称
printf("VV测试= %s\n",VV测试.getName());
for(int i=0;i<4;i++)
{
printf("VV测试[i]= %s\n",VV测试[i].getName());//打印 vvd_0,vvd_1,vvd_2,vvd_3
}
#endif
}
还有内置vector的修改就不帖出来了.
std::vector<int> arr1;
std::vector<std::vector<int>> arr2;
std::vector<std::vector<int>> arr3;
std::vector<std::vector<std::vector<int>>> arr4;
arr1.push_back(2);
arr2.push_back(arr1);
arr3.push_back(arr1);
arr4.push_back(arr3);
对于arr2[0] , arr3[0], arr4[0][0] 你希望他们的实例名分别叫什么?[/quote]
按层级命名,arr2[0]叫 arr2_0 arr3[0]叫 arr3_0 arr4[0][0] 叫 arr4_0_0 arr4[1][2] 叫 arr4_1_2
因为我现在主要处理大场景的3d数据,所以通常会有4到5个vector 嵌套,所以这样命名比较直观.[/quote]
那就简单了:
直接继承vector就好了,
跟是否debug/release 也没有关系了,
之前vector的接口该怎么用还怎么用,
那些不需要进行这种检测的实例,也不受影响
MyVector.h
#ifndef __MyVector_h__
#define __MyVector_h__
#include <vector>
template <class T>
class MyVector;
template <class T>
bool IsMyVector(MyVector<T>& v, const std::string& fatherName, size_t _Pos)
{
v.SetName(fatherName, _Pos);
return true;
}
template <class T>
bool IsMyVector(T& v, const std::string& fatherName, size_t _Pos)
{
return false;
}
template <class T>
class MyVector : public std::vector<T, std::allocator<T>>
{
public:
MyVector(const std::string& name) : m_Name(name)
{
}
void SetName(const std::string& fatherName, size_t _Pos)
{
char name[1024] = {};
sprintf_s(name, 1024, "%s_%d", fatherName.c_str(), _Pos);
m_Name = name;
}
T& operator[](size_t _Pos)
{
if (_Pos < size())
{
T& t = (*(this->_Myfirst + _Pos));
IsMyVector(t, m_Name, _Pos);
return t;
}
else
{
char name[1024] = {};
sprintf_s(name, 1024, "%s_%d", m_Name.c_str(), _Pos);
m_Name = name;
throw m_Name;
}
}
private:
std::string m_Name;
};
#endif
测试代码:
#include <iostream>
#include "MyVector.h"
int main(int argc, char* argv[])
{
MyVector<int> arr1("arr1");
MyVector<MyVector<int>> arr2("arr2");
MyVector<MyVector<MyVector<int>>> arr3("arr3");
MyVector<MyVector<MyVector<MyVector<int>>>> arr4("arr4");
arr1.push_back(2);
arr2.push_back(arr1);
arr3.push_back(arr2);
arr4.push_back(arr3);
try
{
arr4[0][0][0][10] = 2;
}
catch (std::string& e)
{
std::cout << "exception:" << e.c_str() << std::endl;
}
try
{
MyVector<MyVector<int>>& temp = arr4[0][0];
temp[10][0] = 2;
}
catch (std::string& e)
{
std::cout << "exception:" << e.c_str() << std::endl;
}
try
{
MyVector<MyVector<MyVector<MyVector<int>>>>::iterator it = arr4.begin();
MyVector<MyVector<MyVector<int>>>& temp = *it;
temp[10][0][0] = 2;
}
catch (std::string& e)
{
std::cout << "exception:" << e.c_str() << std::endl;
}
system("pause");
return 0;
}
把你需要检测的vector 换成 MyVector 就好了
输出:
exception:arr4_0_0_0_10
exception:arr4_0_0_10
exception:arr4_0_10
std::vector<int> arr1;
std::vector<std::vector<int>> arr2;
std::vector<std::vector<int>> arr3;
std::vector<std::vector<std::vector<int>>> arr4;
arr1.push_back(2);
arr2.push_back(arr1);
arr3.push_back(arr1);
arr4.push_back(arr3);
对于arr2[0] , arr3[0], arr4[0][0] 你希望他们的实例名分别叫什么?[/quote]
按层级命名,arr2[0]叫 arr2_0 arr3[0]叫 arr3_0 arr4[0][0] 叫 arr4_0_0 arr4[1][2] 叫 arr4_1_2
因为我现在主要处理大场景的3d数据,所以通常会有4到5个vector 嵌套,所以这样命名比较直观.
std::vector<int> arr1;
std::vector<std::vector<int>> arr2;
std::vector<std::vector<int>> arr3;
std::vector<std::vector<std::vector<int>>> arr4;
arr1.push_back(2);
arr2.push_back(arr1);
arr3.push_back(arr1);
arr4.push_back(arr3);
对于arr2[0] , arr3[0], arr4[0][0] 你希望他们的实例名分别叫什么?