CAPI c++ 遍历lua表

简介:

1.一些用来遍历lua表的api简介

以下是对下面几个函数的认识不对请批评指正:

lua_istable:是否是一个表 
lua_gettable(L,int index) :把lua栈的索引为index表的lua栈的index+1所指的索引的值弹出。也就是弹出table[index+1]; 
lua_next(L,index):先把 表(lua栈 index所指的表), 的当前索引弹出,再把table 当前索引的值弹出,也就是先弹出 table的索引,再弹出table索引的值

2.代码示例

复制代码
// lua_table_extent.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "stdafx.h"
#include "lua.hpp"
#include "lauxlib.h"
#include "lualib.h"
#include <string.h>
#include <windows.h>
#include <iostream>
using namespace std;
#pragma comment(lib,"lua5.1.lib")
#pragma comment(lib,"lua51.lib")


/*
luaJ_table.lua文件内容
----------------------------------------------
NUMBER_TABLE =
{ 11,
22,
33,
44,
}

NUMBER_TABLE_WITH_INDEX =
{
["a"] = 1,
["b"] = 2,
["c"] = 3
}


STRING_TABLE_WITH_INDEX =
{
["a"] = "this is a",
["b"] = "this is b",
["c"] = "this is c"
}
-----------------------------------------------
*/

int _tmain(int argc, _TCHAR* argv[])
{

    lua_State *L = luaL_newstate();
    luaL_openlibs(L);

    if(0 != luaL_loadfile(L,"lua_table.lua"))
    {
        printf("loadbuff error :%s",lua_tostring(L,-1));
        lua_pop(L,1);
    }

    if(0 != lua_pcall(L,0,0,0))
    {
        printf("pcall error :%s",lua_tostring(L,-1));
        lua_pop(L,1);
    }

    lua_getglobal(L,"STRING_TABLE_WITH_INDEX");
    /*此时lua栈状态
    ----------------------------------
    |  -1 table NUMBER_TABLE
    ----------------------------------
    */

    if(!lua_istable(L,-1))
        cout<<"not a table"<<endl;
    /*此时lua栈状态
    ----------------------------------
    |  -1 table NUMBER_TABLE
    ----------------------------------
    */

    lua_pushnumber(L,1);
    /*此时lua栈状态
    ----------------------------------
    |  -1 1 key
    |  -2 table NUMBER_TABLE
    ----------------------------------
    */
    lua_gettable(L,-2);
    /*此时lua栈状态
    ----------------------------------
    |  -1 1 Value
    |  -2 table NUMBER_TABLE
    ----------------------------------
    */
    if(lua_isnumber(L,-1))
        cout<<lua_tonumber(L,-1)<<endl;
    else if(lua_isstring(L,-1))
        cout<<lua_tostring(L,-1)<<endl;
    /*此时lua栈状态
    ----------------------------------
    |  -1 1 Value
    |  -2 table NUMBER_TABLE
    ----------------------------------
    */
    lua_pop(L,1);
    /*此时lua栈状态
    ----------------------------------
    |  -1 table NUMBER_TABLE
    ----------------------------------
    */


    //循环遍历
    lua_pushnil(L);
    /*此时lua栈状态
    ----------------------------------
    |  -1 nil
    |  -2 table NUMBER_TABLE
    ----------------------------------
    */
    while(lua_next(L,-2))
    {
    /*此时lua栈状态
    ----------------------------------
    |  -1 value
    |  -2 key
    |  -3 table NUMBER_TABLE
    ----------------------------------
    */
        if(lua_isnumber(L,-2))
            cout<<"key:"<<lua_tonumber(L,-2)<<'\t';
        else if(lua_isstring(L,-2))
            cout<<"key:"<<lua_tostring(L,-2)<<'\t';
        if(lua_isnumber(L,-1))
            cout<<"value:"<<lua_tonumber(L,-1)<<endl;
        else if(lua_isstring(L,-1))
            cout<<"value:"<<lua_tostring(L,-1)<<endl;

    /*此时lua栈状态
    ----------------------------------
    |  -1 value
    |  -2 key
    |  -3 table NUMBER_TABLE
    ----------------------------------
    */
        lua_pop(L,1);
    /*此时lua栈状态
    ----------------------------------
    |  -1 key
    |  -2 table NUMBER_TABLE
    ----------------------------------
    */
    }
    lua_pop(L,1);

    /*此时lua栈状态
    ----------------------------------
    |  -1 table NUMBER_TABLE
    ----------------------------------
    */
    lua_close(L);
    system("pause");
    return 0;
}
复制代码

以上代码的输出为

key:a   value:this is a
key:c   value:this is c
key:b   value:this is b
请按任意键继续. . .
相关文章
|
1月前
|
数据采集 存储 算法
【C++数据结构——图】图的遍历(头歌教学实验平台习题) 【合集】
本文介绍了图的遍历算法,包括深度优先遍历(DFS)和广度优先遍历(BFS)。深度优先遍历通过递归方式从起始节点深入探索图,适用于寻找路径、拓扑排序等场景;广度优先遍历则按层次逐层访问节点,适合无权图最短路径和网络爬虫等应用。文中提供了C++代码示例,演示了如何实现这两种遍历方法,并附有测试用例及结果,帮助读者理解和实践图的遍历算法。
44 0
|
1月前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
51 2
|
7月前
|
存储 算法 搜索推荐
|
7月前
|
存储 C++
C++的list-map链表与映射表
```markdown C++ 中的`list`和`map`提供链表和映射表功能。`list`是双向链表,支持头尾插入删除(`push_front/push_back/pop_front/pop_back`),迭代器遍历及任意位置插入删除。`map`是键值对集合,自动按键排序,支持直接通过键来添加、修改和删除元素。两者均能使用范围for循环遍历,`map`的`count`函数用于统计键值出现次数。 ```
|
8月前
|
算法 搜索推荐 C++
C++之STL常用算法(遍历、查找、排序、拷贝、替换、算数生成、集合)
C++之STL常用算法(遍历、查找、排序、拷贝、替换、算数生成、集合)
|
8月前
|
算法 C++ 容器
C++之vector容器操作(构造、赋值、扩容、插入、删除、交换、预留空间、遍历)
C++之vector容器操作(构造、赋值、扩容、插入、删除、交换、预留空间、遍历)
386 0
|
8月前
|
C++
C++数组(定义、遍历、长度、地址、最大值、逆置、冒泡排序)
C++数组(定义、遍历、长度、地址、最大值、逆置、冒泡排序)
123 0
|
8月前
|
存储 C++
C++的list-map链表与映射表
这篇教程介绍了C++中`list`链表和`map`映射表的基本使用。`list`链表可通过`push_front()`、`push_back()`、`pop_front()`和`pop_back()`进行元素的添加和删除,使用迭代器遍历并支持在任意位置插入或删除元素。`map`是一个键值对的集合,元素自动按键值排序,可使用下标操作符或`insert()`函数插入元素,通过迭代器遍历并修改键值对,同时提供`count()`方法统计键值出现次数。教程中包含多个示例代码以帮助理解和学习。
|
8月前
|
计算机视觉 C++
【见微知著】OpenCV中C++11 lambda方式急速像素遍历
【见微知著】OpenCV中C++11 lambda方式急速像素遍历
82 0
|
8月前
|
C++ 安全
高效遍历:C++中分隔字符串单词的3种方法详解与实例
拷贝并交换(Copy-and-Swap)是C++中实现赋值操作符和异常安全拷贝构造函数的技巧。它涉及创建临时对象,使用拷贝构造函数,然后交换数据以确保安全。C++11之前的策略在此后及C++11引入的移动语义和右值引用下仍有效,但后者提供了更高效的实现方式。