如何将结果存储在C ++中的Map中,然后迭代它然后打印出结果?

时间:2013-10-13 06:19:21

标签: c++ map cassandra libcql

我已经开始为Cassandra使用C++ libcql库了。我正在尝试使用带有libcql库的C ++从Cassandra中检索数据..

每当我使用cqlsh继续使用命令行并选择这样 -

select record_name, record_value from profile_user where user_id = '1';

我总是在cql命令行上获得以下输出,其中record_name和record_value实际上是TEXT datatype which is UTF-8 encoded string的列。

 record_name | record_value
-------------+--------------
          e1 |        hello
          e2 |        hello

现在来到C ++世界 -

现在我正在尝试从C++ libcql library中检索相同的内容...我将在C ++中运行相同的上述选择查询,我想返回一个具有e1, e2 as the key和{的地图{1}} ...可以在C ++中完成吗?

HELLO as there value inside that map

下面是在运行我的C ++程序后将在控制台上打印出结果的方法 -

/**
 * This method will retrieve the data from Cassandra..
 * And then call print_rows method to print it out on the console
 */
void get_attributes(string id){
    try{

        // some code

        //Connection open
        connection_open();

        execute_query("USE testks;");

        //this will give me the result back of the select query
        cql_result_t& result = execute_query("select * from profile_user where key ='"+id+"';");

        // and this is printing it out on the console
        print_rows(result);

        // some code
    } catch (int e){
        // some code here
    }
}

我在运行上面的C ++程序后在控制台上看到的结果是这样的 -

/**
 * This method prints out the result on the console..    *
 *
 */
void print_rows(cql::cql_result_t& result) {
    while (result.next()) {
        for (size_t i = 0; i < result.column_count(); ++i) {
            cql::cql_byte_t* data = NULL;
            cql::cql_int_t size = 0;
            result.get_data(i, &data, size);
            std::cout.write(reinterpret_cast<char*>(data), size);
            std::cout << " | ";
        }
        std::cout << std::endl;
    }
}

但我正在寻找的是 - 将结果存储在C ++中的Map中,使得Map中的键应为e1 | hello | e2 | hello | ..并且它们的值应为{ {1}}在同一个Map中...然后迭代Map并用C ++打印出结果?这可能与我当前的代码有关吗?

如果是,有人可以提供一个简单的例子吗?感谢...

这基本上是一个C ++问题我想..只是检索数据并将其放入Map ...但我面临的问题是我的背景完全是Java,所以有点难以弄清楚如何那样做......

我已将此问题中的表格设计略微更改为原始问题here而不是使用集合,现在我正在使用复合键..

但是,如果我能找出上一个问题的解决方案,那么我将采用这种方法,否则我将采用这种方法..

感谢您的帮助...

更新代码: -

通过以下更改,它总是打印出第一个结果两次?不确定为什么?

e1 and e2

我在这里做错了吗?

1 个答案:

答案 0 :(得分:1)

所以看起来你的键和值在每次传递时是交替的,

你可以这样:

bool flag=false;
std::map<std::string, std::string> m;
std::string key,value;

void print_rows(cql::cql_result_t& result) {
    while (result.next()) {
         //...
            if(!flag)
            {
                key=reinterpret_cast<char*>(data);
                flag= true;   
            }
            else if(flag)
            {
                value=reinterpret_cast<char*>(data);
                m[key] = value;
                flag = false;
            }
           // ....
        }
        //...
    }

现在横穿地图:

std::map<std::string, std::string>::const_iterator it=m.begin();

for(;it!=m.end();++it)
  std::cout << it->first << " : " << it->second << std::endl;

或者如果您使用的是C ++ 11:

for(const auto &it:m)
  std::cout << it.first << " : "<< it.second << std::endl;