Как создать список кортежей C++

Я довольно новичок в c++, у меня действительно нет фона в нем. Я связываю, чтобы создать список кортежей, первый будет int, второй будет строкой.

  #include <string>
  #include <list>
  #include <boost/tuple/tuple.hpp>
  ....
  list< tuple<int,string> > time;

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

Как создать этот список?

4 ответов


для простого использования списка std::vector вместо std::list.

вы, вероятно, просто хотите что-то простое, например:

#include <iostream>
#include <vector>
#include <string>
#include "boost/tuple/tuple.hpp"

using namespace std;
using boost::tuple;

typedef vector< tuple<int,string> > tuple_list;

int main(int arg, char* argv[]) {
    tuple_list tl;
    tl.push_back( tuple<int, string>(21,"Jim") );

    for (tuple_list::const_iterator i = tl.begin(); i != tl.end(); ++i) {
        cout << "Age: " << i->get<0>() << endl;
        cout << "Name: " << i->get<1>() << endl;
    }
}

std::list на самом деле является реализацией дважды связанного списка, который вам может не понадобиться.


ответы здесь немного устарели, и не говорите вам, как сортировать список.

С C++11 вы можете использовать стандартный tuple С vector например:

#include <tuple>
#include <vector>
// ...
vector<tuple<int, string>> data;

добавить записи вы можете использовать emplace_back метод vector. Вот пример чтения из стандартного ввода:

#include <iostream>
// ...
int age;
string name;
while(cin >> age >> name) data.emplace_back(age, name);

для сортировки, достаточно использовать стандартный sort функция, так как int является первым элементом кортежа в нашем случае порядок сортировки по умолчанию будет сортировать элементы по ints первый, потом strings:

#include <algorithm>
// ...
sort(data.begin(), data.end());

вы можете извлечения значений из кортежа!--17--> по индексу:

get<0>(data[i])

или типа:

get<int>(data[i])

я собрал полный пример, который вы можете увидеть в прямом эфире на ideone.


здесь может быть не актуально, но если "часть создания"содержит заполнение списка элементами, Boost.Назначение может быть полезно. Вы можете сделать что-то вроде этого:

#include <boost/assign/list_of.hpp>
#include <vector>

int main()
{
    typedef boost::tuple<int, std::string> tuple;

    std::vector<tuple> v = boost::assign::tuple_list_of(1, "foo")(2, "bar");
}

в зависимости от вашего сценария, конечно.


просто в качестве примечания:

новый стандарт C++ вводит variadic шаблоны и с этим также кортежи. gcc и Visual Studio (по крайней мере) поддерживают их. Поэтому, если это возможно для вас (т. е. если все поддерживаемые компиляторы поддерживают кортежи, что уже очень вероятно), вы можете использовать это.

единственная проблема заключается в том, что некоторые компиляторы все еще имеют Кортеж в пространстве имен std::tr1, а другие уже имеют его в пространстве имен std. Также иногда вам нужно включить и иногда. Но вы можете настроить свою систему сборки для определения некоторых макросов, которые помогут вам поддерживать несколько схем. Если вам, например, нужно только поддерживать Visual Studio 10 и / или совершенно новую версию gcc, вы можете сделать следующее:

#include <list>
#include <string>
#include <tuple>

std::list<std::tuple<int, string> > time;

например, с cmake вы можете создать файл заголовка, который приносит вам поддержку для всех компиляторов, которые поддерживают кортежи (и с немного большей работой даже использовать boost в качестве отступления).

для этого нужно создать что-то вроде кортежа.ч. файл CMake:

#if defined( __GNUC__ ) && (__GNUC__ * 100 + __GNUC_MINOR__ < 430)
# define GCC_OLDER_THAN_430 1
#endif

#if defined( _MSC_VER ) && (_MSC_VER < 1600 /* 2010 */)
# define MSC_OLDER_THAN_2010 1
#endif

#if defined( GCC_OLDER_THAN_430 )
# define TR1_IN_TR1_SUBDIRECTORY 1
#endif

#if defined( ZORBA_GCC_OLDER_THAN_430 ) || defined( ZORBA_MSC_OLDER_THAN_2010 )
# define TR1_NS_IS_STD_TR1 1
#endif

#ifdef TR1_NS_IS_STD_TR1
# define TR1_NS std::tr1
#else
# define TR1_NS std
#endif

#ifdef TR1_IN_TR1_SUBDIRECTORY
#  include <tr1/tuple>
#else
#  include <tuple>
#endif

затем выше пример будет выглядеть следующим образом:

#include <string>
#include <list>
#include "tuple.h"

std::list<TR1_NS::tuple<int, std::string> > time;

Это должно работать почти на всех последних компиляторах.