Каков тип данных элемента пары в векторе? - PullRequest
0 голосов
/ 18 января 2019

Мне нужно временно объявить firstElement из пары, которая находится в векторе

vector<pair<char*, int> > rezVector; //is  vector I'm using
auto tempPair = rezVector[0].first; //Is solution I got, but my teacher won't accept (I must know data type)

Я уже пробовал

char tempPair;
char* tempPair;
char tempPair[20];

EDIT Для тех, кто хочет знать, как я его использую:

 sort(rezVector.begin(), rezVector.end(), compareFn);
char*& tempPair = rezVector[0].first; //Already with solution
for(int i=0; i<m; i++){
    for(int j=i+1; j<m-1; j++){
        if(rezVector[i].second == rezVector[j].second){
            if(strcmp(rezVector[i].first, rezVector[j].first)>0){
                tempPair = rezVector[i].first;
                rezVector[i].first = rezVector[j].first;
                rezVector[j].first = tempPair;
            }
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Доступ к паре .first фактически дает вам ссылку на соответствующую запись, так что rezVector[0].first будет иметь тип char*&. Это позволяет вам изменять содержимое rezVector[0].first, если вы действительно хотите это сделать. Но вы также можете присвоить результат rezVector[0].first объекту типа char*, так что вы получите копию указанного значения.

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

См. Разницу в следующем примере:

int main() {
    char val1[] = "Hello";
    char val2[] = "World";
    char val3[] = "out there";

    vector<pair<char*, int> > rezVector; //is  vector I'm using
    rezVector.push_back({val1,10});
    cout << "initial: " << rezVector[0].first << std::endl;

    char*& tempPairFirstReadWrite = rezVector[0].first;
    tempPairFirstReadWrite = val2;
    cout << "changed: " << rezVector[0].first << std::endl;

    char* tempPairFirstReadOnly = rezVector[0].first;
    tempPairFirstReadOnly = val3;
    cout << "not changed again: " << rezVector[0].first << std::endl;

}

Выход:

initial: Hello
changed: World
not changed again: World
0 голосов
/ 18 января 2019

Ваш учитель, вероятно, может ожидать самых разных вещей, включая

char * temp = rezVector[0].first;
char *& temp = rezVector[0].first;
const char * temp = rezVector[0].first;
std::string temp = rezVector[0].first;
std::string_view temp = rezVector[0].first;

Вам нужно будет спросить их о назначении temp, чтобы узнать, какой (если таковой имеется) ответ, который они ищут.

...