Векторы указателей на элементы другого вектора

#c #pointers #vector

#c #указатели #вектор

Вопрос:

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

 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>amp; 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(amp;current_time, amp;thetime);
    for (unsigned i = 0; i < foo.size();   i) {
        if (foo[i].day == current_time.tm_mday amp;amp;
            foo[i].month == current_time.tm_mon amp;amp;
            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.
}
  

Это не изменяет исходное значение.

Комментарии:

1. Почему указатель? Почему не ссылка? И не ясно, в чем заключается ваш вопрос.

2. Вопрос в том, как я могу этого достичь?

3. Вы, кажется, хотите сделать две вещи. Можете ли вы сделать либо одно из них? Что вы пробовали?

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

5. Почему бы вам просто не заполнить вектор temp, а затем поменять его на aa? И да, в вашем коде ваши векторы отличаются vector<type> и vector<type*>

Ответ №1:

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

 void Func(std::vector<type> amp; 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(amp;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.
}
  

Комментарии:

1. Если вы хотите быть уверены, что указатели не признаны недействительными, используйте std::deque для вашего основного контейнера. Если элементы добавлены в начале или в конце, указатели все еще действительны.

Ответ №2:

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

 void Function(std::vector<type>amp; aa)
  

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

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

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

Я не знаю, зачем вам нужны две ссылки на один вектор, но эй, вы спросили 🙂

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

Комментарии:

1. У меня есть что-то вроде: ‘code’ void Oglos_Wydarzenie(std::vector<Wydarzenie>amp; zmienna) {std::vector<Wydarzenie> obecne; tm AktualnyCzas = {0,0,0,0,0,0,0,0}; time_t czas; czas = time (NULL); localtime_s (amp;AktualnyCzas ,amp;czas); для (без знака i = 0; i < zmienna.size(); i) если (zmienna[i].dzien == Актуальный.tm_mday amp;amp; zmienna[i].miesiac == Актуальный.tm_mon amp;amp; zmienna[i].rok == Актуальный.tm_year 1900) obecne.push_back(zmienna[i]); std:: cout << obecne.size() << std::endl; obecne[0].tytul = «Zmienione»; }’код’, и это не изменяет исходное значение

2. @adadad: Отредактируйте это в своем вопросе.

3. @adadad Писать код на английском — хорошая идея по целому ряду причин.

4. @Neil Butterworth: Я перевел пример на английский. 🙂

Ответ №3:

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

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

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