C++从C继承了数组,几乎无处不在.C++提供了易于使用且不易出错的抽象(std::vector<T>自C++ 98和C++ 11std::array<T, n>以来),因此对数组的需求并不像在C中那样频繁出现.但是,当您阅读遗产时代码或与用C编写的库交互,你应该牢牢掌握数组如何工作.
本FAQ分为五个部分:
如果您觉得此常见问题解答中缺少重要内容,请写下答案并将其作为附加部分链接到此处.
在下文中,"数组"表示"C数组",而不是类模板std::array.假定了C声明符语法的基本知识.请注意,面对异常,手动使用new和delete如下所示是非常危险的,但这是另一个常见问题解答的主题.
(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法一开始就出现了,所以你的答案很可能被那些提出想法的人阅读.)
可能重复:
为什么使用迭代器而不是数组索引?
我正在回顾我对C++的了解,我偶然发现了迭代器.我想知道的一件事是什么让它们如此特别,我想知道为什么:
using namespace std;
vector<int> myIntVector;
vector<int>::iterator myIntVectorIterator;
// Add some elements to myIntVector
myIntVector.push_back(1);
myIntVector.push_back(4);
myIntVector.push_back(8);
for(myIntVectorIterator = myIntVector.begin();
myIntVectorIterator != myIntVector.end();
myIntVectorIterator++)
{
cout<<*myIntVectorIterator<<" ";
//Should output 1 4 8
}
Run Code Online (Sandbox Code Playgroud)
比这更好:
using namespace std;
vector<int> myIntVector;
// Add some elements to myIntVector
myIntVector.push_back(1);
myIntVector.push_back(4);
myIntVector.push_back(8);
for(int y=0; y<myIntVector.size(); y++)
{
cout<<myIntVector[y]<<" ";
//Should output 1 4 8
}
Run Code Online (Sandbox Code Playgroud)
是的,我知道我不应该使用std命名空间.我刚把这个例子从cprogramming网站上删除了.那么请你告诉我为什么后者更糟?有什么大不同?
在一些代码,我继承,我看到经常使用size_t与std命名空间限定词.例如:
std::size_t n = sizeof( long );
Run Code Online (Sandbox Code Playgroud)
当然,它编译并运行良好.但对我来说这似乎是不好的做法(也许是从C继承下来的?).
是不是真的size_t是内置到C++中,因此在全局命名空间中?是否需要size_t在C++中使用头文件?
提出这个问题的另一种方法是,是否需要在所有C++编译器上编译以下程序(没有包含)?
size_t foo()
{
return sizeof( long );
}
Run Code Online (Sandbox Code Playgroud) 这是一个相当愚蠢的问题,但为什么int常用而不是unsigned int在C或C++中为数组定义for循环时?
for(int i;i<arraySize;i++){}
for(unsigned int i;i<arraySize;i++){}
Run Code Online (Sandbox Code Playgroud)
我认识到int在进行数组索引以外的操作时使用的好处以及使用C++容器时迭代器的好处.是不是因为在循环数组时无关紧要?或者我应该一起避免它并使用不同的类型,如size_t?
shared_ptr观察者20.8.2.2.5 C++ 14最终草案(n4296)
Run Code Online (Sandbox Code Playgroud)long use_count() const noexcept;返回:共享所有权的
shared_ptr对象数,或者为空时为0 .*this*this*this[注意:
use_count()效率不一定. - 结束说明]
我正在学习基本的C++,现在我从用户那里得到了一个字符串,我想检查他们是否输入了整个文件名(包括.txt).我有字符串,但如何检查字符串是否以".txt"结尾?
string fileName;
cout << "Enter filename: \n";
cin >> fileName;
string txt = fileName.Right(4);
Run Code Online (Sandbox Code Playgroud)
该Right(int)方法仅适用于CString,因此上述代码不起作用.如果可能的话,我想使用常规字符串.有任何想法吗?
请参阅本指南:http:
//google-styleguide.googlecode.com/svn/trunk/cppguide.xml?showone = Integer_Types #Integer_Types
谷歌建议int大部分时间使用.
我尝试遵循本指南,唯一的问题是STL容器.
例如:
1.
void SetElement(int Index, int Value)
{
if (Index > Vector.size()) return;
...
}
Run Code Online (Sandbox Code Playgroud)
如果我用int了Index,我得到了一个警告这里.
2.
for (int i = 0; i < Vector.size(); ++i)
{
...
}
Run Code Online (Sandbox Code Playgroud)
说到循环计数器,同样的警告.
如果我声明Index或i当unsigned int它传播,我必须声明更多变量,unsigned int并且不会有一致性.
我能想到的最好的方法是使用像:
if (Index > static_cast<int>(Vector.size()) ...或者
for (int i = 0; i < static_cast<int>(Vector.size()); ++i) ...
我真的不喜欢演员.
有建议的方法吗?
PS
还有更多的理由比链接给出的for循环示例.
要仅使用有符号整数,我可以避免有符号/无符号警告,强制转换,
并确保每个值都可以是负数(为了保持一致),
并且我总是可以使用-1作为无效值. …
#include <stdio.h>
int arr[] = {1,2,3,4,5,6,7,8};
#define SIZE (sizeof(arr)/sizeof(int))
int main()
{
printf("SIZE = %d\n", SIZE);
if ((-1) < SIZE)
printf("less");
else
printf("more");
}
Run Code Online (Sandbox Code Playgroud)
编译后的输出gcc是"more".为什么if条件,即使失败-1 < 8?
我一直在通过在不同平台上编译来对我的应用程序进行一些测试,而从64位系统向32位系统的转变暴露了许多问题.
我大量使用向量,字符串等,因此需要对它们进行计数.但是,我的函数也使用32位无符号数,因为在很多情况下我需要显式地使用正整数.
我遇到了看似简单的任务的问题,例如std::min和std::max,这可能更系统化.请考虑以下代码:
uint32_t getmax()
{
return _vecContainer.size();
}
Run Code Online (Sandbox Code Playgroud)
看起来很简单:我知道向量不能有负数的元素,所以返回无符号整数就完全有道理了.
void setRowCol(const uint32_t &r_row; const uint32_t &r_col)
{
myContainer_t mc;
mc.row = r_row;
mc.col = r_col;
_vecContainer.push_back(mc);
}
Run Code Online (Sandbox Code Playgroud)
再次,简单.
问题:
uint32_t foo(const uint32_t &r_row)
{
return std::min(r_row, _vecContainer.size());
}
Run Code Online (Sandbox Code Playgroud)
这给了我错误,例如:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/algorithm:2589:1: note: candidate template ignored: deduced conflicting types for parameter '_Tp' ('unsigned long' vs. 'unsigned int')
min(const _Tp& __a, const _Tp& __b)
Run Code Online (Sandbox Code Playgroud)
我做了很多挖掘,在一个平台上,vector :: size_type是一个8字节的数字.但是,根据设计,我使用无符号的4字节数字.这可能会导致事情变得古怪,因为您无法隐式地将8字节数转换为4字节数.
解决方案是做老式的weay:
#define MIN_M(a,b) a < b ? a : b
return …Run Code Online (Sandbox Code Playgroud) 我有以下代码:
#include <iostream>
using namespace std;
int main()
{
int a = 0x80000000;
if(a == 0x80000000)
a = 42;
cout << "Hello World! :: " << a << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是
Hello World! :: 42
Run Code Online (Sandbox Code Playgroud)
所以比较有效.但是编译器告诉我
g++ -c -pipe -g -Wall -W -fPIE -I../untitled -I. -I../bin/Qt/5.4/gcc_64/mkspecs/linux-g++ -o main.o ../untitled/main.cpp
../untitled/main.cpp: In function 'int main()':
../untitled/main.cpp:8:13: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
if(a == 0x80000000)
^
Run Code Online (Sandbox Code Playgroud)
所以问题是:为什么0x80000000是unsigned int?我可以以某种方式签名以摆脱警告吗?
据我所知,0x80000000将是INT_MIN,因为它超出正整数的范围.但为什么编译器会假设我想要一个正数?
我正在使用linux上的gcc版本4.8.1 20130909进行编译.
在阅读这个问题时,我看到第一条评论说:
size_t对于长度不是一个好主意,正确的类型是签名的优化/ UB原因.
其次是支持推理的另一条评论.这是真的吗?
这个问题很重要,因为如果我要写一个矩阵库,图像尺寸可能是size_t,只是为了避免检查它们是否为负数.但是所有循环都会自然而然地使用size_t.这会对优化产生影响吗?
我正在尝试为我的程序做案例菜单。我总是收到交叉初始化错误,我以前从未见过这个错误。也许有人可以向我解释我的代码出了什么问题。
#include <iostream>
#include <cstdlib>
#include <string>
#include <sstream>
#include <stdlib.h>
#include <fstream>
using namespace std;
#define N_CARS 1
struct car{
string model;
int year;
double price;
bool available;
}cars [N_CARS];
void menu();
void mainMenu();
void writeToFile(ofstream &outputFile , const car& p)
{
outputFile << p.model << " "
<< p.year << " "
<< p.price << " "
<< p.available<<"\n";
}
int choice1 = 0;
int main(int argc, char** argv) {
menu();
return 0;
}
void menu() {
do …Run Code Online (Sandbox Code Playgroud) 我在使用这样的循环时遇到了一个问题,
//vector<int> sides;
for (int i = 0; i < sides.size()-2; i++) {
if (sides[i] < sides[i+1] + sides[i+2]) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
问题是size()方法使用无符号数字。因此,大小小于2的向量会产生不确定的结果。
我知道我应该为循环使用一个无符号变量,但是它不能解决问题。所以我不得不通过类型转换或使用某些条件来处理它。
我的问题是,为什么STL为什么使用unsigned int来消除否定索引访问冲突并产生更多问题?
c++ ×12
c ×2
stl ×2
arrays ×1
c++-faq ×1
c++11 ×1
c++14 ×1
casting ×1
comparison ×1
containers ×1
for-loop ×1
if-statement ×1
indexing ×1
int ×1
integer ×1
iterator ×1
long-integer ×1
loops ×1
menu ×1
pointers ×1
shared-ptr ×1
signed ×1
size ×1
size-t ×1
sizeof ×1
string ×1
unsigned ×1
vector ×1
warnings ×1