这是我到目前为止的代码:
class Base
{
public:
Base();
void addClass(int index);
vector<Class*> classList;
};
void Base::addClass(int index)
{
if(classList.at(index) ) //want to check if there is nothing already store at
//that index
{
Class* c = new Class();
//want to add this ^ to the classList vector at the index
}
//and so on
}
我该怎么做呢?看起来很简单,但我仍然卡住了。非常感谢任何和所有的帮助。谢谢!
答案 0 :(得分:0)
我建议使用std::map<int, Class*>
。
如果您坚持使用std::vector<Class*>
,则必须提前调用resize()
函数来分配一些空间。
答案 1 :(得分:0)
这会使classList大小增加一个:
Class* c = new Class();
classList.insert(classList.begin() + index, c);
答案 2 :(得分:0)
你可以下标成一个向量:
classList[index] = c;
您也可以使用insert
功能,但传递数字索引并不容易。您必须添加到迭代器:
classList.insert(classList.begin() + index, c);
答案 3 :(得分:0)
您必须检查向量的size
。否则,如果index
大于大小,程序将因访问无效的内存位置而崩溃。
void Base::addClass(int index)
{
Class* c = new Class();
if(classList.size()< index) //check size
{
classList.resize(index+1); //resize if less then index
classList[index]=c; // this location must be empty, as it was just allocated by previous line
}
else if(classList.at(index) == NULL) //else if that location is empty, place it
{
classList[index]=c;
}
else{ //else add at the end of the vector
classList.push_back(c)
}
}
答案 4 :(得分:0)
矢量是顺序的;每个职位都有一些东西
介于0和classList.size()
之间,其他地方没有。如果是
指针(以及其他一些东西),内容可以为空
指针,所以虽然有东西,但它是一个非常特殊的
什么东西,在更高层次上可以被认为是没有。
如果这是您正在寻找的内容:
void
Base::addClass( int index )
{
if ( classList.size() <= index ) {
classList.resize( index + 1 );
}
if ( classList[index] == nullptr ) {
classList[index] = new Class();
}
}
首先确保矢量足够大,然后测试
nullptr
。
向量仍将包含每个索引的条目
classList.size()
。如果您拨打addClass
一次,请使用
1000000的index
,这意味着很多空条目。
如果这是你的用例,那么你应该考虑一些
一种sparce数据结构(也许是std::map<int,
Class*
)。如果index
没有稀疏分布,那么
矢量解决方案很好。
最后一点:它几乎从不适合使用
std::vector<>::at()
。如果超出范围索引是
一个编程错误,你希望程序崩溃(这是
非优化构建中的常见行为);你不想要的东西
程序错误的情况是展开堆栈(通常情况下
案例 - 有例外)。
答案 5 :(得分:0)
也许这样的事情就足够了?这将替换指定索引处的项而不使用classList [i](应使用带向量的迭代器)。
Class* c = new Class();
classList.erase(classList.begin()+index);
classList.insert(classList.begin()+index, c);
工作示例:here