Здравствуйте. Какой способ получения контейнера из класса предпочтительнее для каждого из вариантов списка:
- по значению;
- без копирования, с возможностью редактирования полученного контейнера;
- без копирования и без возможности редактирования.
#ifndef MYCLASS_H
#define MYCLASS_H
#include <vector>
class MyClass
{
public:
    MyClass();
    std::vector<int> getVec0();
    std::vector<int> &getVec1();
    const std::vector<int> &getVec2();
    void getVec3(std::vector<int>::iterator &itBeg, std::vector<int>::iterator &itEnd);
    void getVec4(std::vector<int>::const_iterator &itBeg, std::vector<int>::const_iterator &itEnd);
    void getVec5(std::vector<int> &vec);
    void getVec6(std::vector<int> *vec);
private:
    std::vector<int> myVec;
};
#endif // MYCLASS_H
И ещё вопросик, насколько допустимо объявление структур и функций не являющихся членами класса в *.h, но используемых в реализации функций-членов в *.cpp? Например, есть у меня обёртка для функций boost::spirit, заголовочные файлы и структуры, определяющие грамматики, объявлены только в parser.cpp и никак не фигурируют в parser.h.
/* parser.h */
//...
class MyParser
{
public:
    void getMyCon(string str, vector<int>::const_iterartor &itBegin, vector<int>::const_iterator &itEnd);
private:
    vector<int> myCon;
};
//...
/* parser.cpp */
#include "myparser.h"
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
//...
void foo(vector<int> &vec, int val)
{
    //...
}
template <typename Iterator>
struct MyGrammar
        : qi::grammar<Iterator, vector<int>(), qi::space_type>
{
    //...
};
void MyParser::getMyCon(string str, vector<int>::const_iterartor &itBegin, vector<int>::const_iterator &itEnd)
{
    //...
}





