Как поместить элементы в константный вектор? - PullRequest
4 голосов
/ 21 марта 2012

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

const std::vector<std::string>&,

Я пытался сделать это:

gradeReported.push_back(firstEntry);

Я получаю сообщение об ошибке.Я почти уверен, что это как-то связано с константной природой вектора.Помощь будет оценена!

Ответы [ 6 ]

6 голосов
/ 21 марта 2012

Ты не.Если это const, его нельзя изменить.Вам нужно сделать копию или взять ее по неконстантной ссылке.

4 голосов
/ 21 марта 2012

Нельзя помещать элементы в константный вектор, состояние векторов - это элементы, которые оно содержит, а добавление элементов в вектор изменяет это состояние.

Если вы хотите добавить вектор, вы должны принятьв неконстантной ссылке.

void f(std::vector<int>& v)
{ 
    v.push_back(4);
}
2 голосов
/ 21 марта 2012

Если у вас есть вектор const, это означает, что вы можете читать элементы только из этого вектора.
При использовании квалификатора const к вектору применяются те же правила, что и к любому другому типу.

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

1 голос
/ 21 марта 2012

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

Если вам действительно нужно изменить его, есть два варианта:

  1. Создайте копию вектора и измените ее вместо этого.
  2. Удалите константу с помощьюconst_cast.

Создание копии

const std::vector<std::string>& foo;
std::vector<std::string> bar(foo);

Удаление const с помощью const_cast

Я настоятельно рекомендую не использовать это, но, возможно, это вариант.

Предполагая, что строковому вектору предоставляется постоянная защита перед передачей в качестве параметра методу или функции, и что базовый тип на самом деле не const, тогда можно сделать следующее:

typedef std::vector<std::string> string_vector;
void f(const string_vector& foo) {
    const string_vector& foo;
    const_cast<string_vector>(foo).push(firstEntry);
}

int main() {
    string_vector foo();
    f(foo);
}
1 голос
/ 21 марта 2012

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

0 голосов
/ 21 марта 2012

вы должны удалить const в вашей декларации или, если это невозможно, использовать

const_cast<std::vector<std::string>& >(gradeReported).push_back(firstEntry);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...