添加到矢量中的特定位置

时间:2014-05-09 08:14:18

标签: c++ visual-c++ vector

这是我到目前为止的代码:

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

}

我该怎么做呢?看起来很简单,但我仍然卡住了。非常感谢任何和所有的帮助。谢谢!

6 个答案:

答案 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