поддержка gcc для метода cbegin и cend - PullRequest
3 голосов
/ 20 февраля 2012

Какая версия компилятора gcc поддерживает бесплатные методы const_iterator для контейнеров, например: cbegin, cend, crbegin, crend. Я использую gcc 4.6.1 с функциями c ++ 0x, включенными флагом -std=c++0x, но эти методы не могут быть разрешены в моем коде.

Ответы [ 4 ]

4 голосов
/ 20 февраля 2012

К сожалению, в стандарте нет свободных функций cbegin / cend, равно как и нет никаких обратных версий.Тем не менее, вы всегда можете использовать приведение, чтобы получить постоянный итератор:

auto it = std::begin(static_cast<T const &>(x));

Используя std::add_const из <type_traits>, вы даже сможете получить что-то довольно общее, если вам это нужно много.


Функции-члены контейнера cbegin / crbegin и т. Д. Являются частью C ++ 11, и GCC поддерживает их в течение некоторого времени;вполне возможно начиная с 4.3 (когда впервые появилась поддержка C ++ 11).GCC 4.6 определенно поддерживает их;если у вас возникли проблемы, опубликуйте проблемный код.

1 голос
/ 05 августа 2013

Мой эксперимент показывает, что по умолчанию "cbegin" недоступен (например, из контейнеров <vector> <map> STL). Если вы не укажете --std=c++0x или --std=c++11

Вот мой эксперимент на GCC 4.8:

http://ascii.io/a/4539

Если ваш компилятор не поддерживает эти --std переключатели (как я делаю на некоторых кроссплатформенных цепочках инструментов), вы можете просто использовать что-то вроде:

for (std::vector<string>::const_iterator it = vec.begin(), ite = vec.end();
                                         it != ite; ++it) {
    /* ... ... */
}

Это работает с версиями GCC, которые не поддерживают функцию автоматического ввода ключевых слов в C ++ 11.

0 голосов
/ 20 февраля 2012

Не могли бы вы добавить свой собственный?

template< class C > 
auto cbegin( C& c ) -> decltype(c.cbegin());

template< class C > 
auto cbegin( const C& c ) -> decltype(c.cbegin())
0 голосов
/ 20 февраля 2012

У меня работает (GCC 4.6.0):

#include <vector>

int main() {
  std::vector<int> vec;
  auto it = vec.cbegin();
  // int& val = *it;  // gives compiler error, as expected
}

Функции-члены также присутствуют в stl_vector.h.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...