有啥类似于 Python 在 c++ 中的索引吗?
Posted
技术标签:
【中文标题】有啥类似于 Python 在 c++ 中的索引吗?【英文标题】:Is there anything similar to Python's indexing in c++?有什么类似于 Python 在 c++ 中的索引吗? 【发布时间】:2018-09-17 15:23:09 【问题描述】:我正在使用 C++ 中的字符数组的一部分,并试图找出最简单的方法来做到这一点。我知道在 Python 中你可以简单地做一些类似 str[1:] 的事情,它会给你除了第一个位置之外的整个数组,并且想知道 C++ 是否有任何类似物,或者如果没有,实现这个的最简单方法是什么。
【问题讨论】:
您可以通过迭代器和范围获得类似的东西,但更冗长。例如,std::next(std::begin(str), 1)
到 std::end(str)
的范围将是 str
,但第一个元素除外。
在大多数通过命名子字符串操作表示的语言中,名称如substr
、left
、mid
、right
。第一个来自 C++,后三个来自一些 Basic。为了提高效率,请查看std::string_view
。
你可以使用std::string::substr(1)
。
在 C++17 中有 std::strigng_view
(或者对于旧的 C++ 版本提升 strigng_view
)。还有类似std::valarray
的东西,其中slice
的功能与python 运算符[]
非常相似。
注意:Python 中的这个特性称为切片。只是想我会给您这个术语,以便您将来可以进行更有效的搜索。
【参考方案1】:
目前,您可以尝试将 Boost.Range(sliced 等)库用作仅标题的库(在 theboostcpplibraries.com 上有一个关于它的 chapter)。
库文档中的示例:
#include <boost/range/adaptor/sliced.hpp>
#include <boost/range/algorithm/copy.hpp>
#include <boost/assign.hpp>
#include <iterator>
#include <iostream>
#include <vector>
int main(int argc, const char* argv[])
using namespace boost::adaptors;
using namespace boost::assign;
std::vector<int> input;
input += 1,2,3,4,5,6,7,8,9;
boost::copy(
input | sliced(2, 5),
std::ostream_iterator<int>(std::cout, ","));
return 0;
未来标准中可能会有一个叫做span<T>
的东西(讨论here)。
【讨论】:
以上是关于有啥类似于 Python 在 c++ 中的索引吗?的主要内容,如果未能解决你的问题,请参考以下文章