Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >迭代std :: vector:unsigned与有符号的索引变量?

迭代std :: vector:unsigned与有符号的索引变量?

提问于 2017-12-25 08:35:12
回答 2关注 0查看 407

在C ++中迭代一个向量的正确方法是什么?

考虑这两个代码片段,这个工作正常:

代码语言:txt
AI代码解释
复制
for (unsigned i=0; i < polygon.size(); i++) {
代码语言:txt
AI代码解释
复制
    sum += polygon[i];
代码语言:txt
AI代码解释
复制
}

和这个:

代码语言:txt
AI代码解释
复制
for (int i=0; i < polygon.size(); i++) {
代码语言:txt
AI代码解释
复制
    sum += polygon[i];
代码语言:txt
AI代码解释
复制
}

生成warning: comparison between signed and unsigned integer expressions。

我是C ++世界的新手,所以unsigned变量对我来说看起来有些可怕,而且我知道unsigned如果使用不正确,变量可能是危险的,所以 - 这是正确的吗?

回答 2

最爱开车啦

发布于 2017-12-25 09:08:58

在你的例子中的具体情况,我会使用STL算法来完成这个。

代码语言:txt
AI代码解释
复制
#include <numeric> 
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
sum = std::accumulate( polygon.begin(), polygon.end(), 0 );

对于一个更一般的,但仍然相当简单的情况下,我会去:

代码语言:txt
AI代码解释
复制
#include <boost/lambda/lambda.hpp>
代码语言:txt
AI代码解释
复制
#include <boost/lambda/bind.hpp>

代码语言:txt
AI代码解释
复制
using namespace boost::lambda;
代码语言:txt
AI代码解释
复制
std::for_each( polygon.begin(), polygon.end(), sum += _1 );

秋之夕颜清

发布于 2017-12-25 09:08:34

使用标准的C ++ 11(又名C ++ 0x),实际上有一个新的令人愉快的方法(以打破向后兼容性为代价):new auto关键字。它可以节省您不得不显式指定要使用的迭代器的类型(再次重复向量类型)的痛苦,当(编译器)显而易见的时候,使用哪种类型。随着v做你的vector,你可以这样做:

代码语言:txt
AI代码解释
复制
for ( auto i = v.begin(); i != v.end(); i++ ) {
代码语言:txt
AI代码解释
复制
    std::cout << *i << std::endl;
代码语言:txt
AI代码解释
复制
}

C ++ 11更进一步,为您提供了一个特殊的语法来迭代像矢量集合。它消除了写东西总是一样的必要性:

代码语言:txt
AI代码解释
复制
for ( auto &i : v ) {
代码语言:txt
AI代码解释
复制
    std::cout << i << std::endl;
代码语言:txt
AI代码解释
复制
}

要在工作程序中查看它,请构建一个文件auto.cpp:

代码语言:txt
AI代码解释
复制
#include <vector>
代码语言:txt
AI代码解释
复制
#include <iostream>
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
int main(void) {
代码语言:txt
AI代码解释
复制
    std::vector<int> v = std::vector<int>();
代码语言:txt
AI代码解释
复制
    v.push_back(17);
代码语言:txt
AI代码解释
复制
    v.push_back(12);
代码语言:txt
AI代码解释
复制
    v.push_back(23);
代码语言:txt
AI代码解释
复制
    v.push_back(42);
代码语言:txt
AI代码解释
复制
    for ( auto &i : v ) {
代码语言:txt
AI代码解释
复制
        std::cout << i << std::endl;
代码语言:txt
AI代码解释
复制
    }
代码语言:txt
AI代码解释
复制
    return 0;
代码语言:txt
AI代码解释
复制
}

在写这篇文章的时候,当你用g ++编译时,通常需要通过给出一个额外的标志来将它设置为使用新的标准:

代码语言:txt
AI代码解释
复制
g++ -std=c++0x -o auto auto.cpp

现在你可以运行这个例子:

代码语言:txt
AI代码解释
复制
$ ./auto

请注意,编译和运行的指令是Linux上特定于gnu c ++编译器的,程序应该是平台(和编译器)独立的。

和开发者交流更多问题细节吧,去 写回答
相关文章
std::vector初始化[通俗易懂]
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/09/29
1.4K0
3,变量与标点符号
与C等许多编程语言相比,作为动态语言的Python,其变量是一个标签,而不是一个容器。
lyhue1991
2020/07/20
9850
3,变量与标点符号
std::vector find_vectornator工具使用
vector本身是没有find这一方法,其find是依靠algorithm来实现的。
全栈程序员站长
2022/09/27
3680
从 C++ STD::VECTOR的RESIZE和RESERVE看VECTOR的源码实现
https://www.cnblogs.com/yocichen/p/10574819.html https://www.kancloud.cn/digest/stl-sources/177267
早起的鸟儿有虫吃
2022/01/20
1.9K0
从 C++ STD::VECTOR的RESIZE和RESERVE看VECTOR的源码实现
C++ std::vector元素的内存分配问题
来看一个问题: 在使用C++ STL的vector时,下面三种写法有什么不同呢?其内存分配是怎么样的呢?
卡尔曼和玻尔兹曼谁曼
2019/01/22
3.6K0
C++ std::vector元素的内存分配问题
动态数组和C++ std::vector详解
std::vector是C++的默认动态数组,其与array最大的区别在于vector的数组是动态的,即其大小可以在运行时更改。std::vector是封装动态数组的顺序容器,且该容器中元素的存取是连续的。
艰默
2023/09/05
7520
动态数组和C++ std::vector详解
std::function与std::bind
一、背景介绍: 函数指针始终不太灵活,它只能指向全局或静态函数,对于类成员函数、lambda表达式或其他可调用对象就无能为力了,因此,C++11推出了std::function与std::bind这两件大杀器,他们配合起来能够很好的替代函数指针。
灰子学技术
2022/01/18
9940
C++ std::vector元素的内存分配问题(补充)
在上篇博文C++ std::vector元素的内存分配问题中我们已经明确了使用std::vector容器时元素在内存中的创建情况。 所以,我个人觉得使用std::vector<T> vec;这种类型的最省时省力。 我们还是看原来的例子:
卡尔曼和玻尔兹曼谁曼
2019/01/22
1.9K0
size_type、size_t、differentce_type以及ptrdiff_t
目录(?)[-] size_type size_t different_type ptrdiff_t size_t是unsigned类型,用于指明数组长度或下标,它必须是一个正数,std::size_
猿人谷
2018/01/17
1K0
stl中的size_type,difference_type和value_type,reference
c++11新特性标准中,编译器可以通过auto或者decltype来推断变量的类型
大忽悠爱学习
2021/11/15
1K0
std::jthread与std::thread区别
​std::jthread是C++20新引入的线程类,与 std::thread 类似,或者说,jthread是对thread进一步的封装,功能更强大​。
音视频牛哥
2022/04/03
1.4K0
<c++ 常用代码块> | std::string 与 std::wstring转化
#include <string>#include <locale>#include <codecvt>// convert string to wstringinline std::wstring to_wide_string(const std::string& input){std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;return converter.from_bytes(input);}// convert wstring t
IsEva
2022/12/05
1.1K0
模拟实现vector/迭代器失效问题
对于STL,我们不仅学会使用STL,还要了解其底层原理,这样一来,我们就能知道什么时候用string好,什么时候用vector,什么时候用list,哪种方法效率高等等。其次了解了STL的底层原理,也助于我们的C++功力大增!
二肥是只大懒蓝猫
2023/03/30
4100
模拟实现vector/迭代器失效问题
如何优雅的使用 std::variant 与 std::optional
std::variant与std::optional是c++17加入的新容器,variant主要是为了提供更安全的union, 而optional除了存取T类型本身外, 还提供了一个额外的表达optional是否被设置值的状态.
fangfang
2021/10/29
4K0
Python3下的【并行迭代】与【按索引
在使用python3时,有【并行迭代】与【按索引迭代】,并行迭代相对来说好理解,现在介绍下【按索引迭代】。
py3study
2020/01/03
7690
C++教程(最全)「建议收藏」
七种基本的C++数据类型:bool、char、int、float、double、void、wchar_t 类型修饰符:signed、unsigned、short、long 注:一些基本类型可以使用一个或多个类型修饰符进行修饰,比如:signed short int简写为short、signed long int 简写为long。
全栈程序员站长
2022/08/10
2.6K0
C++教程(最全)「建议收藏」
C++教程(凯格尔训练法教程)
七种基本的C++数据类型:bool、char、int、float、double、void、wchar_t 类型修饰符:signed、unsigned、short、long 注:一些基本类型可以使用一个或多个类型修饰符进行修饰,比如:signed short int简写为short、signed long int 简写为long。
全栈程序员站长
2022/08/01
3K0
C++教程(凯格尔训练法教程)
无符号数和有符号数
人有十个手指头,习惯了逢十进一,于是十进制成了生活中的标准。程序的世界只有高低电平两种状态,更适合用二进制来表示,于是二进制成了程序世界的标准。 对与无符号数来说,我们更喜欢谈他们之间的转化,十进制是我们最习惯的进制,于是十进制转为R进制,R进制转为十进制变尤为重要。
naget
2019/07/03
3.3K0
无符号数和有符号数
std::function与std::bind使用总结
C++中函数指针的用途非常广泛,例如回调函数,接口类的设计等,但函数指针始终不太灵活,它只能指向全局或静态函数,对于类成员函数、lambda表达式或其他可调用对象就无能为力了,因此,C++11推出了std::function与std::bind这两件大杀器。
forrestlin
2019/07/29
11.5K0
C++ vector用法详解
  vector的元素在内存中连续排列,这一点跟数组一样。这意味着我们元素的索引将非常快,而且也可以通过指针的偏移来获取vector中的元素。
猫叔Rex
2020/06/30
9.5K0

相似问题

unsigned int与size_t?

2688

如何找出一个项目是否存在于std :: vector中?

2378

我怎样才能知道std :: vector的大小/长度(以字节为单位)?

12.3K

多索引与多列索引?

2386

你如何获得foreach循环的当前迭代的索引?

2275
相关问答用户
新浪微博 | 高级总监擅长4个领域
腾讯云TDP | 产品KOL擅长5个领域
腾讯 | 技术专家擅长2个领域
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档