2014-02-14 4 views
2

Я прошу прощения, если этот вопрос был задан/ответил в другом месте, но я не нашел ничего, так как я не совсем уверен, что/как спросить это ...Контейнера с нелинейным содержанием

Что я m пытается сделать, это создать какой-то контейнер; список, массив, вектор, что-нибудь, что позволит мне размещать и удалять объекты из определенных индексов.

Что-то вроде этого:

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

Я собираюсь быть движущиеся объекты из вектора в определенный индекс этого контейнера и из этого контейнера в другой вектор.

Что было бы лучшим способом представить это и какой контейнер лучше всего подходит? Я изначально использовал вектор, но встроенные функции, похоже, не дали мне достаточного контроля над тем, где объект оказался. Это было либо спереди, либо сзади.

Мне нужно выяснить, как лучше удерживать эти «пустые» индексы и свободно перемещать объекты в каждом элементе.

+2

Как насчет std :: map? –

+2

Вы можете размещать элементы везде, где хотите, с помощью оператора '[]': v [i] = item; ' –

+1

@MarkkuK. Сначала необходимо инициализировать достаточно слотов (например, с помощью 'resize()'). Поскольку вектор не может иметь отверстий, если вам нужны пустые слоты, вам нужно значение, которое интерпретируется как значение пустое (например, нулевой указатель, целые числа 0 или -1, определяемый пользователем объект с некоторым особым состоянием). – delnan

ответ

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) пространство, в котором вы нуждаетесь заранее.

+0

Спасибо, Дэвид. Я действительно не знал о резерве, и я думаю, что это именно то, что я ищу. Кроме того, я чувствую себя очень «noobish», не понимая, что элементы вектора могут быть доступны непосредственно через скобки ... Возможно, над мышлением, что один и просто никогда не пробовал это, я думаю. Это должно быть огромной помощью для моего проекта. – Prototype958

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.

Если вы просто означает, что вы хотите разместить ваши данные в произвольных местах, вы можете напрямую использовать синтаксис [].

Смежные вопросы