Hi

I recently started to refresh my C++ knowledge - I only done few basic C++ apps before - and Qt.
Now, I did manage to get my Qt stuff working, including custom QAbstractListModel implementation and although this is not relevant (and knowledge of Qt in general is not needed to answer my question), it may give people who are familiar with it a bit more insight.

I have a library made of two classes, let's call them Loader and Record. The loader loads data from SQLite database into a Vector<Record>. The class Record contains several strings (std::string), plenty of integers (signed, unsigned, shorts) and also a lot of booleans. This is how my vector is initialized:

Code:
// Loader.h
Vector<Record> records;

// Loader.cpp
Loader::Loader() {
    records.reserve(30000);
}
Having in mind that it will be passed to my QAbstractListModel implementation that must be able to:
1. Access stored objects by index to read their properties
2. Update stored objects by index
3. Remove stored objects by index
4. Remove stored objects by Record instance (or pointer to it?)
5. Add new objects at certain positions (to keep the order of elements based on one of their properties)
6. Ensure uniqueness based on one of the properties [identifier]
7. Find one of the objects based on some of the properties

What really should I return from my Loader class and what kind of data structure would be suitable to hold what has been returned from Loader in my QAbstractListModel? (or structures for that matter).

I came up with such approach:
1. Return shared_ptr to this Vector<Record> from my Loader
2. To ensure uniqueness, use std::unordered_set holding identifiers

As far as I know this will allow me to achieve goals 1, 2, 3, 6 in efficient manner, but I'm unsure about points 4, 5 and 7. This would also mean vector's elements are not copied (or am I wrong?) which is what I'd like to avoid.

So, would you find my approach correct or is there any room for improvements? Would you suggest another way of doing it, that would either be more performant and still readable or be easier to read and keep performance of my approach?

Forgive me if this question sounds silly, but I've spent last few years working mainly with PHP, so no pointers and no thinking of what type of data structure / collection is used in most cases.