Векторы указателей на элементы другого вектора - PullRequest
0 голосов
/ 15 мая 2011

EI имеет функцию, которая принимает в качестве указателя параметра на вектор:

void Function(std::vector<type>* aa)

Теперь внутри этой функции я хочу отфильтровать данные из этого вектора в другой вектор, и я хочу изменить данные исходного вектора, изменивзначения этого временного.Черт, трудно понять что-то вроде:

void Function(std::vector<type>* aa)
{
    std::vector<type*> temp; //to this vector I filter out data and by changning 
    //values of this vector I want to autmatically change values of aa vector
}

У меня есть что-то вроде этого:

void Announce_Event(std::vector<Event>& foo)
{
    std::vector<Event> current;
    tm current_time = {0,0,0,0,0,0,0,0,0};
    time_t thetime;
    thetime = time(NULL);
    localtime_s(&current_time, &thetime);
    for (unsigned i = 0; i < foo.size(); ++i) {
        if (foo[i].day == current_time.tm_mday &&
            foo[i].month == current_time.tm_mon &&
            foo[i].year == current_time.tm_year+1900)
        {
            current.push_back(foo[i]);
        }
    }
    std::cout << current.size() << std::endl;
    current[0].title = "Changed"; //<-- this is suppose to change value.
}

Это не меняет первоначальное значение.

Ответы [ 3 ]

6 голосов
/ 15 мая 2011

Я думаю, что у вас могут быть проблемы с сообщением о ваших намерениях, поэтому это требует экстрасенсорного ответа.

void Func(std::vector<type> & aa)
{
    std::vector<type*> temp;

    // I wish <algorithm> had a 'transform_if'    
    for(int i=0; i<aa.size(); ++i)
    {
        if( some_test(aa[i]) )
            temp.push_back(&aa[i])
    }

    // This leaves temp with pointers to some of the elements of aa.
    // Only those elements which passed some_test().  Now any modifications
    // to the dereferenced pointers in temp will modify those elements
    // of aa.  However, keep in mind that if elements are added or
    // removed from aa, it may invalidate the pointers in temp.
}
2 голосов
/ 15 мая 2011

Не используйте указатель на vector, используйте вместо него ссылку:

void Function(std::vector<type>& aa)

внутри функции вы теперь можете обращаться к содержимому векторов как обычно.

void Function(std::vector<type>& aa)
{
    std::vector<type>& temp = aa;

    // if you now append something to temp, it is also appended to aa
    aa.push_back(type());
}

Я не знаю, почему вы хотите две ссылки на один вектор, но вы спросили:)

РЕДАКТИРОВАТЬ: удалена опечатка, см. Комментарии. Thanx

0 голосов
/ 15 мая 2011

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

Это будет делать то, что вы хотите:

void Oglos_Wydarzenie(std::vector<Wydarzenie>& zmienna)
{
    std::vector<Wydarzenie *> obecne;
    tm AktualnyCzas = {0,0,0,0,0,0,0,0,0};
    time_t czas;
    czas = time(NULL);
    localtime_s(&AktualnyCzas,&czas);
    for (unsigned i = 0; i < zmienna.size(); ++i) {
        if (zmienna[i].dzien == AktualnyCzas.tm_mday &&
            zmienna[i].miesiac ==  AktualnyCzas.tm_mon &&
            zmienna[i].rok == AktualnyCzas.tm_year+1900)
        {
            obecne.push_back(&zmienna[i]);
        }
    }
    std::cout << obecne.size() << std::endl;
    obecne[0]->tytul = "Changed"; //<-- this is suppose to change value.
}

Вы можете сделать это со всеми указателями и вообще без ссылок, но тогда это выглядит намного более запутанным:

void Oglos_Wydarzenie(std::vector<Wydarzenie>* zmienna)
{
    std::vector<Wydarzenie *> obecne;
    tm AktualnyCzas = {0,0,0,0,0,0,0,0,0};
    time_t czas;
    czas = time(NULL);
    localtime_s(&AktualnyCzas,&czas);
    for (unsigned i = 0; i < zmienna->size(); ++i) {
        if ((*zmienna)[i].dzien == AktualnyCzas.tm_mday &&
            (*zmienna)[i].miesiac ==  AktualnyCzas.tm_mon &&
            (*zmienna)[i].rok == AktualnyCzas.tm_year+1900)
        {
            obecne.push_back(&((*zmienna)[i]));
        }
    }
    std::cout << obecne.size() << std::endl;
    obecne[0]->tytul = "Changed"; //<-- this is suppose to change value.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...