Форум программистов, компьютерный форум CyberForum.ru

Работа с STL vector - C++

Восстановить пароль Регистрация
 
__sirroko
4 / 4 / 3
Регистрация: 03.03.2013
Сообщений: 55
26.04.2014, 11:19     Работа с STL vector #1
Добрый день!

Прошу объяснить следующие моменты связанные с <vector> (почему ругается студия,
откуда берутся такие результаты) и дать совет, как стоить изменить перегруженные операторы [].

I.
C++
1
2
3
4
5
6
7
8
9
10
11
std::vector<int> vector;
//...
int& CVector::operator[](const int index) const
{
  return vector[index];
}
 
int& CVector::operator[](const int index)
{
  return vector[index];
}
Для const-метода тудия сообщает о такой ошибке:
IntelliSense: отброшены квалификаторы в ссылке, привязывающей тип "int &" к инициализатору типа "const int"
c:\Users\sirroko\Documents\Visual Studio 2013\Projects\OOP\lab2\CVector.cpp 29 10 lab2


II.
Попробовал переписать const-метод следующим образом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
std::vector<int> vector;
//...
CVector::CVector(const CVector& obj)
{
  for (int i = 0; i < obj.vector.size(); i++) {
    vector.push_back(obj.vector[i]);
  }
}
//...
int& CVector::operator[](const int index) const
{
  int t = vector[index];
  return t;
}
 
int& CVector::operator[](const int index)
{
  return vector[index];
}
Студия молчит, но в конструкторе копирования vector заполняется следующим образом (при условии, что obj.vector содерижт два элемента: 1, 2).

obj {vector={ size=2 } } const CVector &
vector { size=2 } std::vector<int,std::allocator<int> >
[size] 2 int
[capacity] 2 int
[0] 1 int
[1] 2 int


this 0x002cf888 {vector={ size=2 } } CVector *
vector { size=2 } std::vector<int,std::allocator<int> >
[size] 2 int
[capacity] 2 int
[0] -858993460 int
[1] -858993460 int



III.
Если обращаться в конструкторе копирования к obj.vector[i] (в обход переопределенных мной []),
то все работает отлично.
C++
1
2
3
4
5
6
CVector::CVector(const CVector& obj)
{
  for (int i = 0; i < obj.vector.size(); i++) {
    vector.push_back(obj.vector[i]);
  }
}
this 0x002ffc9c {vector={ size=2 } } CVector *
vector { size=2 } std::vector<int,std::allocator<int> >
[size] 2 int
[capacity] 2 int
[0] 1 int
[1] 2 int


obj {vector={ size=2 } } const CVector &
vector { size=2 } std::vector<int,std::allocator<int> >
[size] 2 int
[capacity] 2 int
[0] 1 int
[1] 2 int


Заранее спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.04.2014, 11:19     Работа с STL vector
Посмотрите здесь:

C++ STL vector,list
C++ vector STL
Работа с STL. Поменять vector на list C++
C++ STL vector index operator
C++ STL vector iterator
C++ STL vector запись в файл
C++ stl sort vector не сортирует ?!
C++ stl::vector, метод pop_back()

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
26.04.2014, 11:22     Работа с STL vector #2
const-метод должен возвращать копию значения или ссылку на константу.
__sirroko
4 / 4 / 3
Регистрация: 03.03.2013
Сообщений: 55
26.04.2014, 11:58  [ТС]     Работа с STL vector #3
Т.е. так? Да, это работает...
C++
1
2
3
4
const int& CVector::operator[](const int index) const
{
  return vector[index];
}
Почему const дает такой эффект?..

И еще вот что странно. Изначально вместо <vector> я использовал обычный int-массив, но такого поведения как в I и II не было.

Вот как было изначально.
C++
1
2
3
4
5
6
7
8
9
10
11
int * vector = new int[count];
//...
int& CVector::operator[](const int index) const
{
  return vector[index];
}
 
int& CVector::operator[](const int index)
{
  return vector[index];
}
Yandex
Объявления
26.04.2014, 11:58     Работа с STL vector
Ответ Создать тему
Опции темы

Текущее время: 07:45. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru