ссылаясь на вектор - PullRequest
       2

ссылаясь на вектор

2 голосов
/ 09 февраля 2011

У меня есть этот код

void split(vector<float> &fvec, string str)
{
    int place = 0;
        for(int i=0; i<str.length(); i++)
        {
            if(str.at(i) == ' ')
            {
                fvec.push_back(atoi(str.substr(place,i-place).c_str()));
                place=i+1;
            }
        }
        fvec.push_back(atoi(str.substr(place).c_str()));
}

То, что я пытаюсь сделать, это передать ссылку на вектор в метод, чтобы он разбил строку, которую я даю, на float, не копируя вектор ... я нехочу скопировать вектор, потому что он будет содержать тысячи чисел.

нельзя ли передать вектор по ссылке или я просто совершаю глупую ошибку?

, если это поможет, вот код, который я тестирую с помощью

int main (void)
{
    vector<float> fvec;
    string str = "1 2 2 3.5 1.1";

    split(&fvec, str);

    cout<<fvec[0];

    return 0;
}

Ответы [ 4 ]

7 голосов
/ 09 февраля 2011

Это действительно возможно.Вы просто используете неправильный синтаксис.Правильный способ сделать это:

split(fvec, str);

То, что вы делаете, неправильно, потому что он передает адрес вектора в качестве намеченной ссылки.

2 голосов
/ 09 февраля 2011

Если вы используете современный компилятор, такой как gcc / g ++, он выполняет оптимизацию именованных возвращаемых значений, так что вам не нужно передавать возвращаемое значение по ссылке или указателю.

См.

http://en.wikipedia.org/wiki/Return_value_optimization/

http://cpp -next.com / archive / 2009/08 / want-speed-pass-by-value /

1 голос
/ 09 февраля 2011

Вы передаете адрес вектора. (split(&fvec, str);)

Вызов должен быть split(fvec, str); без &.

0 голосов
/ 09 февраля 2011

Очевидная вещь, которая выпадает, это split(&fvec, str); в вашей функции main, что означает, что вы передаете не вектор, а адрес вектора.Это правильно, если ваш векторный параметр является указателем, но не является ссылкой.Вместо этого используйте split(fvec, str);.

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

И, если вы беспокоитесь о передаче больших данныхструктуры вокруг, что из строкового параметра?Разве это не становится большим?

...