Проблема указателя/ссылки вектора C++

Смотрите на этот пример:

#include <iostream>
#include <vector>
#include <string>
using namespace std;

class mySubContainer
{
public:
    string val;
};

class myMainContainer
{
public:
    mySubContainer sub;
};

void doSomethingWith( myMainContainer &container )
{
    container.sub.val = "I was modified";
}

int main( )
{
    vector<myMainContainer> vec;


    /**
     * Add test data
     */
    myMainContainer tempInst;

    tempInst.sub.val = "foo";
    vec.push_back( tempInst );

    tempInst.sub.val = "bar";
    vec.push_back( tempInst );


    // 1000 lines of random code here

    int i;
    int size = vec.size( );
    myMainContainer current;

    for( i = 0; i < size; i ++ )
    {
        cout << i << ": Value before='" << vec.at( i ).sub.val << "'" << endl;

        current = vec.at( i );
        doSomethingWith( current );

        cout << i << ": Value after='" << vec.at( i ).sub.val << "'" << endl;
    }
    system("pause");//i suck

}

Партия ада кода для примера, я знаю.

Теперь, таким образом, Вы не должны проводить годы, думая о том, что это [должно] сделать [es]: у Меня есть класс myMainContainer который имеет как его единственный участник экземпляр mySubContainer. mySubContainer только имеет строку val как участник.

Таким образом, я создаю вектор и заполняю его некоторыми демонстрационными данными.

Теперь, то, что я хочу сделать: Выполните итерации через вектор и сделайте отдельную функцию способной изменить текущий myMainContainer в векторе. Однако вектор остается неизменным, как говорит вывод:

0: Value before='foo'
0: Value after='foo'
1: Value before='bar'
1: Value after='bar'
  • Что я делаю неправильно?

doSomethingWith должен возвратиться пусто, я не могу позволить ему возвратить измененный myMainContainer и затем просто перезапишите его в векторе, вот почему я пытался передать его ссылкой, как замечено в doSomethingWith определении выше.

5
задан sub 5 April 2010 в 10:42
поделиться

4 ответа

Здесь вы делаете копию вектора:

current = vec.at( i );

и изменяете current , но печатаете оригинал, vec.at (i) .

Вместо этого измените объект напрямую, например

doSomethingWith(vec[i]);  // or vec.at(i) for checked access.
11
ответ дан 18 December 2019 в 13:12
поделиться
current = vec.at(i);
doSomethingWith(current);

Измените его на:

doSomethingWith(vec.at(i));
1
ответ дан 18 December 2019 в 13:12
поделиться

Измените внутренний цикл, чтобы не делать копию, а использовать ссылку и поддерживать ссылку таким образом;

myMainContainer &current = vec[ i ];
doSomethingWith( current );

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

2
ответ дан 18 December 2019 в 13:12
поделиться

Если я правильно понимаю, происходит следующее: vector будет хранить копии ваших данных, а не данные напрямую. Интересно, будут ли предложенные ответы действительно полезны, поскольку в любом случае будет сделана копия данных. Чтобы внести изменения в данные, я думаю, вам необходимо сделать следующее. 1. Сохраните указатель на объект, а не непосредственно на объект. 2. Используйте указатели, чтобы получить объект и внести изменения в данные по указателю

Я думаю, это решит ваши проблемы.

0
ответ дан 18 December 2019 в 13:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: