AやB、C1、C2、C3がどういう意味を持つのか分からんとアドバイスは難しいかな。
もしかしたら全て同じクラスで表現して、有向グラフとして構成するのが一番かも知れん。

> クラスの異層間および同層間の参照がある
ノード間に自明な階層構造があるなら、親への弱いポインタとノードの参照パラメタのタプルを持てばいいんじゃない?
class A {
friend B;
vector<shared_ptr<B>> b;
};

class B {
weak_ptr<A> a;
size_t B_index;
}; // this == a.lock()->b[B_index].get();

> B内のvectorを要素の状態に応じてソートする
これはstd::sortで行ける。
尤も、ベクタが常にソートされた状態に保たれるって条件にしたいなら挿入ソートの方が計算量が少なくなって良いけどね。
ex)
sort(c1.begin(), c1.end(),
[](const shared_ptr<C1>& e1, const shared_ptr<C1>& e2) {
return compare(e1->get_parameter(), e2->get_parameter());
}
);