c ++: доступ к элементам карты строк и усиление циклических буферов - PullRequest
1 голос
/ 23 апреля 2011

Я пишу программу, которая читает текстовый файл с названиями городов в вектор, а затем использует stl :: map, чтобы связать каждый город с циклическим буфером наддува. У меня также есть вектор данных о температуре, который я преобразовал в двойной тип после чтения его в виде строк из другого текстового файла. Я хочу знать, как передать эти данные в кольцевой буфер по моему выбору. Например, данные о температуре получены из Бостона, поэтому я хочу поместить их в кольцевой буфер, связанный с Бостоном. Если бы кто-то мог показать мне, как это сделать, я был бы очень признателен! Вот мой код Код, связанный с картами, находится внизу.

#include < map >
#include < algorithm >
#include < cstdlib >
#include < fstream >
#include < iostream >
#include < iterator >
#include < stdexcept >
#include < string >
#include < sstream >
#include < vector >
#include < utility >
#include < boost/circular_buffer.hpp >

double StrToDouble(std::string const& s) // a function to convert string vectors to double.
{
    std::istringstream iss(s);
    double value;

    if (!(iss >> value)) throw std::runtime_error("invalid double");

    return value;
}

using namespace std;

int main()
{

    std::fstream fileone("tempdata.txt"); // reading the temperature data into a vector.

    std::string x;

    vector<string> datastring (0);

    while (getline(fileone, x))
    {
        datastring.push_back(x);
    }

    vector<double>datadouble;

    std::transform(datastring.begin(), datastring.end(), std::back_inserter(datadouble), StrToDouble); // converting it to double using the function



    std::fstream filetwo("cities.txt"); // reading the cities into a vector.

    std::string y;

    vector<string> cities (0);

    while (getline(filetwo, y))
    {
        cities.push_back(y);
    }

    map<string,boost::circular_buffer<double>*> cities_and_temps; // creating a map to associate each city with a circular buffer.

    for (unsigned int i = 0; i < cities.size(); i++)
    {
        cities_and_temps.insert(make_pair(cities.at(i), new boost::circular_buffer<double>(32)));
    }

    return 0;
}

1 Ответ

1 голос
/ 23 апреля 2011

Вы можете инициализировать циркулярный буфер с парой итераторов, например:

std::vector<double> v;
...
... // Fill v with data
...

boost::circular_buffer<double> cb(v.begin(), v.end());

Я не совсем уверен, как вы хотите применить это в вашем конкретном случае. У вас есть только один вектор двойников, но я не знаю, сколько городов. Если вы хотите вставить всю эту информацию в кольцевой буфер, как у вас есть, это было бы так:

cities_and_temps.insert(make_pair(
    cities.at(i),
    new boost::circular_buffer<double>(datadouble.begin(), datadouble.end())));
...