具有非线性内容的容器

时间:2014-02-14 21:26:12

标签: c++ arrays data-structures containers

如果在其他地方询问/回答了这个问题我很抱歉,但由于我不完全确定是什么/怎么问这个问题我没有找到任何答案...

我正在尝试做的是设置某种容器; list,array,vector,what-ever,这将允许我放置和删除特定索引中的对象。

这样的事情:

[empty][empty][object][empty][object][object][empty]

我将把一个向量中的对象移动到这个容器的特定索引中,并从这个容器移动到另一个向量。

最好的方式是什么,以及哪种容器最适合?我最初使用的是矢量,但内置函数似乎并没有让我足够控制对象的最终位置。无论是正面还是背面。

我需要找出保存这些“空”索引的最佳方法,并自由地将对象移入和移出每个元素。

2 个答案:

答案 0 :(得分:1)

如果我正确理解您的问题,您希望根据特定模式将数据放入矢量中。

您可以使用简单的向量并自行实现函数来放置数据。

例如,如果您想在每隔三个位置放置数据:

void placeItem(std::vector<int> my_vector, int element, unsigned int index){
    my_vector[((index+1)*3)-1]=element;
}

int retreiveItem(std::vector<int> my_vector, unsigned  int index){
    return my_vector[((index+1)*3)-1];
}

然后你可以使用placeItem和retreiveItem,索引从0开始。

如果您只是想将数据放在任意位置,那么可以直接使用[]语法。

答案 1 :(得分:1)

一个简单的,绝对不太理想但非常有效的解决方案可能是以下列方式使用向量:

#include <iostream>
#include <vector>
using namespace std;

struct Your_Object
{
    Your_Object& operator=(const Your_Object& other)
    {
        // Write a proper assignment operator here if you want to assign or swap values
        cout << "hello from assignment operator"<<endl;
        return *this;
    }
};

int main() {

    Your_Object nullObj;
    std::vector<Your_Object> vec;
    vec.reserve(10); // Creates 10 empty objects calling default constructors. Notice that this will NOT affect the vector's size, for that use resize()

    Your_Object space5, space3; // Two objects to put in space5 and space3

    // Put objects in space 5 and 3
    vec[5] = space5;
    vec[3] = space3;

    // Move object in space 5 to another place
    vec[1] = vec[5];

    return 0;
}

http://ideone.com/YDu6LC

如果你设法编写一个正确的拷贝赋值操作符(如果你使用C ++ 11,可能还有移动语义),它可以对你的对象进行深层复制,当然这对于你,以上可能是一个简单的工作系统,你需要做什么。

请记住调整大小(或预留差异,看看这里:https://stackoverflow.com/a/7397862/1938163)提前所需的空间。